代码随想录第25天|

cpp 复制代码
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;
    }
};

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

cpp 复制代码
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;
    }
};
cpp 复制代码
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;
    }
};
cpp 复制代码
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 然后找下一个边界

相关推荐
NekoCNN2 分钟前
现代视角下的线性表全解
数据结构
工藤新一¹9 分钟前
C/C++ 数据结构 —— 树(2)
c语言·数据结构·c++·二叉树··c/c++
北京地铁1号线11 分钟前
广告推荐模型2:因子分解机(Factorization Machines, FM)
人工智能·算法·推荐算法
七十二小時1 小时前
力扣热题——前K个高频元素
数据结构·算法·leetcode
500佰1 小时前
AI手办,Gemini 2.5 Flash Image 可一键制作高一致性人物手办
算法
愚润求学2 小时前
【贪心算法】day3
c++·算法·leetcode·贪心算法
空白到白3 小时前
算法练习-合并两个有序数组
数据结构·python·算法
YuTaoShao3 小时前
【LeetCode 热题 100】75. 颜色分类——双指针
算法·leetcode·职场和发展
花开富贵ii5 小时前
代码随想录算法训练营四十九天|图论part07
java·数据结构·算法·图论·prim·kruscal
张同学的IT技术日记5 小时前
数据结构初学者必用:手把手教你写可复用代码模板(附完整示例)
数据结构