代码随想录第25天|

class Solution {
public:
    static bool cmp(const vector<int> &a,const vector<int> &b){
        //邮箱按照身高排列 身高高的在前面 身高相同 第二维小的在前面
        //返回一个布尔值,决定 a 是否应该排在 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);
        vector<vector<int>> res;
        //按照 前面有多少个人大于等于插入
        for(int i=0;i<people.size();i++){
            res.insert(res.begin()+people[i][1],people[i]);
        }
        return res;
    }
};

思路:贪心思想优先比较 身高 然后按照队列要求插入 这是利用了 二个维度优先比较其中一个维度的原理 ,然后按照顺序插入由于之前插入的都比大于等于 所以只要插入到相应位置一定是对的。

class Solution {
private:
    static bool cmp(const vector<int> &a,const vector<int> &b){
        //bool判断想不想a在b前面
        return a[0]<b[0];
    }
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        //首先按照起始位置进行排序
        sort(points.begin(),points.end(),cmp);
        //为了让气球尽可能的重叠,需要对数组进行排序
        //如何一次性射最多的弓箭:使得当前得左边界小于等于 最小右边界 最小右边界都能穿到 其他气球都能穿到
        if(points.size()==0)
          return 0;
        int res=1;
        int min_right=points[0][1];
        for(int i=1;i<points.size();i++){
            if(points[i][0]>min_right){
                res++;
                min_right=points[i][1];
            }else{
                min_right=min(min_right,points[i][1]);
            }    
        }
        return res;
    }
};
class Solution {
public:
    // 按照区间右边界排序
    static bool cmp (const vector<int>& a, const vector<int>& b) {
        return a[1] < b[1]; // 右边界排序 
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if (intervals.size() == 0) return 0;
        sort(intervals.begin(), intervals.end(), cmp);

        int result = 1; // points 不为空至少需要一支箭
        for (int i = 1; i < intervals.size(); i++) {
            if (intervals[i][0] >= intervals[i - 1][1]) {
                result++; // 需要一支箭
            }
            else {  // 气球i和气球i-1挨着
                intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]); // 更新重叠气球最小右边界
            }
        }
        //共有多少个重合的区间 剩下的都要被移除
        return intervals.size() - result;
    }
};
class Solution {
public:
    vector<int> partitionLabels(string s) {
        //前面字符串出现的字母不能出现在最后面记录每个字母最后出现的位置 一直更新 找到区间就+1
        map<char,int> end;
        for(int i=0;i<s.size();i++){
            end[s[i]]=i;
        }
        int now_end=end[s[0]];//目前的最右区间
        //找到最右区间就更新下一个区间
        int left=0,right=0;//代表当前区间的左右边界 返回result
        vector<int> result;
        for(int i=0;i<s.size();i++){
            //当前right
            right=max(right,end[s[i]]);
            if(i==right)
             {
                result.push_back(right-left+1);
                left=i+1;
                right=0;
             }
        }
        return result;
    }
};

思路:从0开始找到最右边界 如果当前最右边界==i 然后找下一个边界

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值