860. 柠檬水找零 - 力扣(LeetCode)//简单。贪心在于遇到20美元优先找10美元和5美元即可。

406. 根据身高重建队列 - 力扣(LeetCode)//中等。很巧妙的思想。

class Solution {
public:
    //bool cmp(const Type& a, const Type& b) {
    // 如果 a 应该排在 b 前面,返回 true;
    // 否则返回 false。
    static bool cmp(vector<int>& a,vector<int>& b){
        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;
        for(int i=0;i<people.size();i++){
            int position=people[i][1];//插入位置,即第i个人的前面应该有多少个比他高的
            auto it = que.begin();//指针指向头节点
            while(position--){
                it++;//往后不断插入
            }
            que.insert(it,people[i]);//插入的时候,假设第i个元素,那么他前面插入了i-1个元素都比他大,所以[i][1]的值不可能超出i-1;
        }
        return vector<vector<int>> (que.begin(),que.end());
    }
};

452. 用最少数量的箭引爆气球 - 力扣(LeetCode)//中等。先按第一位元素的大小排序。然后箭头贪心的选择最右端点。如果新的节点的左端点超出原来的右端点,就加一条箭。

class Solution {
public:
    static bool cmp(const vector<int>& a,const vector<int>& b){
        if(a[0]==b[0]) return a[1]>b[1];
        return a[0]<b[0];
    }
    int findMinArrowShots(vector<vector<int>>& points) {
        sort(points.begin(),points.end(),cmp);
        int result=1;int end=points[0][1];
        for(int i=1;i<points.size();i++){
            if(end>=points[i][0]){
                end=min(points[i][1],end);
            }
            else {
                end=points[i][1];
                result++;
            }
        }
        return result;
    }
};

435. 无重叠区间 - 力扣(LeetCode)//中等。这题正好和上题相反,所以把上一题的代码抄下来,把if条件内的大于等于改为大于(因为[1,2]和[2,3]算不重叠)。最后return 数组size()-result即可。。。

class Solution {
public:
    static bool cmp(const vector<int>& a,const vector<int>& b){
        if(a[0]==b[0]) return a[1]>b[1];
        return a[0]<b[0];
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end(),cmp);
        int result=1;int end=intervals[0][1];
        for(int i=1;i<intervals.size();i++){
            if(end>intervals[i][0]){
                end=min(intervals[i][1],end);
            }
            else {
                end=intervals[i][1];
                result++;
            }
        }
        return intervals.size()-result;
    }        
};

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐