代码随想录算法训练营第二十九天| 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 }