Leetcode 860. 柠檬水找零
题目链接 860 柠檬水找零
本题目比较简单,我一开始并没有看出有需要贪心的地方,看了一下解析:
局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。
下面上代码:
class Solution {
public:bool lemonadeChange(vector<int>& bills) {int five = 0;int ten = 0;int ershi = 0;for(int i=0;i<bills.size();i++){if(bills[i] == 5){five++;}if(bills[i] == 10){if(five>0){five--;ten++;}else{return false;}}if(bills[i] == 20){if(ten>0&&five>0){ten--;five--;ershi++;}else if(five>=3){five-=3;ershi++;}else{return false;}}}return true;}
};
Leetcode 406. 根据身高重建队列
题目链接 406 根据身高重建队列
本题目和分糖果那个题目差不多,也是两个维度分开分析,首先先按照高度排序,再根据k来进行插入操作,但是我觉得好难想,这里学习了一个新的知识点,就是vector底层实现和它的扩容操作,下面直接上代码:
class Solution {
public:
static bool cmp(const vector<int>& a,const vector<int>& b){// 身高从大到小排(身高相同k小的站前面)根据题目要求if(a[0] == b[0]){return a[1]<b[1];}return a[0]>b[0];
}vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort(people.begin(),people.end(),cmp);list<vector<int>> que;// list底层是链表实现,插入效率比vector高的多for(int i=0;i<people.size();i++){int position = people[i][1];// 插入到下标为position的位置std::list<vector<int>>::iterator it = que.begin();while(position--){// 寻找在插入位置,这里的position作为索引下标,是很难想象的it++;}que.insert(it,people[i]);}return vector<vector<int>>(que.begin(),que.end());}
};
Leetcode 452. 用最少数量的箭引爆气球
题目链接 452 用最少数量的箭引爆气球
本题目的贪心思想还是比较明显的,让气球重叠最大话就能用最少的箭引爆气球,只需讨论重叠和不重叠的情况即可,在这之前要对左边界或者右边界进行排序,重叠情况画个图即可明白,下面上代码:
class Solution {private:static bool cmp(const vector<int>& a,const vector<int>& b){return a[0]<b[0];}
public:int findMinArrowShots(vector<vector<int>>& points) {if(points.size() == 0){return 0;}sort(points.begin(),points.end(),cmp);//左边界,从小到大排序int result = 1;for(int i=1;i<points.size();i++){if(points[i-1][1]<points[i][0]){//不重合的情况result++;}else{points[i][1] = min(points[i-1][1],points[i][1]);//重合的情况,继续判断下一个气球范围是否重合}}return result;}
};
end liujiliujibiewangle