代码随想录算法训练营第二十九天| 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

  860.柠檬水找零 

思路:

遇到20,先给10和5,再给三个5

代码:

 1 bool lemonadeChange(vector<int>& bills) {
 2     if (bills.size() == 0) return true;
 3 
 4     map<int, int> currentMoney;
 5     for (int i = 0; i < bills.size(); i++)
 6     {
 7         if (bills[i] == 5)
 8         {
 9             currentMoney[5]++;
10         }
11         else if (bills[i] == 10)
12         {
13             if (currentMoney[5] < 1)
14             {
15                 return false;
16             }
17 
18             currentMoney[5]--;
19             currentMoney[10]++;
20         }
21         else if (bills[i] == 20)
22         {
23             if (currentMoney[5] >= 1 && currentMoney[10] >= 1)
24             {
25                 currentMoney[5]--;
26                 currentMoney[10]--;
27             }
28             else if (currentMoney[5] >= 3) {
29                     currentMoney[5] = currentMoney[5] - 3;
30             }
31             else
32             {
33                 return false;
34             }
35         }
36     }
37 
38     return true;
39 }

 406.根据身高重建队列

注意:

1,虽然要求 前面拍着比当前节点>=K个人,这里可以按照身高先排序,从高到低,这样K前面有几个比自己高的,就是前面第几个数了,很巧妙

2,sort() => compare -》 True的情况是如果为真,那么就把第一个放到前面,为假的话,就放到后面

代码:

 1 vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
 2     vector<vector<int>> result;
 3 
 4     // 先排序
 5     sort(people.begin(), people.end(), 
 6         [](vector<int> a, vector<int>b) {return (a[0] > b[0])||(a[0]==b[0] && a[1]<b[1]); });
 7 
 8     // 然后按照前面有几个的值,进行插入
 9     for (int i = 0; i < people.size(); i++)
10     {
11         result.insert(result.begin() + people[i][1], people[i]);
12     }
13 
14     return result;
15 }

  452. 用最少数量的箭引爆气球  

思路:

先排序,然后如果当前节点位于scope的范围内,那么就缩小范围

如果不位于范围内,那么就加一个箭,然后再从当前开始

代码:

 1 // 要求:给了多个start end数组,找出来他们的交集
 2 // 换句话说: 找出来有几个x可以同时存在于多个交集之中
 3 // 注意:爆了之后,就不存在当前节点
 4 // 具体思路:
 5 // 1,先按照开始节点进行排序,
 6 // 2,当前交集:当前交集和当前节点范围取一个更小的交集,,如果当前起始节点没有在交集里面,那么重新生成一个交集,加入进去
 7 //
 8 int findMinArrowShots(vector<vector<int>>& points) {
 9     if (points.size() == 0) return 0;
10 
11     //应该是排序这里出现了问题
12     sort(points.begin(), points.end());
13 
14     int result = 1;
15     vector<int> scope = points[0];
16 
17     for (int i = 1; i < points.size(); i++)
18     {
19         auto cur = points[i];
20 
21         if (cur[0] <= scope[1])
22         {
23             //如果在这个范围内,取交集
24             scope[0] = cur[0];
25             scope[1] = min(scope[1], cur[1]);
26         }
27         else
28         {
29             result++;
30             scope = cur;
31         }
32     }
33 
34     return result;
35 }

 

posted @ 2023-07-11 11:33  博二爷  阅读(4)  评论(0编辑  收藏  举报