代码随想录第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 然后找下一个边界

相关推荐
武昌库里写JAVA24 分钟前
SpringCloud+SpringCloudAlibaba学习笔记
java·开发语言·算法·spring·log4j
小咖拉眯35 分钟前
第十六届蓝桥杯模拟赛第二期题解—Java
java·数据结构·算法·蓝桥杯·图搜索算法
Sunyanhui138 分钟前
力扣 最长回文字串-5
算法·leetcode·职场和发展
csdn_aspnet41 分钟前
C# 程序来计算三角形的面积(Program to find area of a triangle)
算法·c#
xiangxiang-42 分钟前
目标检测,图像分割,超分辨率重建
算法·机器学习·支持向量机
一直学习永不止步43 分钟前
LeetCode题练习与总结:数组中两个数的最大异或值--421
java·算法·leetcode·字典树·数组·位运算·哈希表
机器学习之心1 小时前
异常检测 | 高斯分布拟合算法异常数据检测(Matlab)
算法·数学建模·matlab·异常数据检测
Ning_.1 小时前
力扣第 66 题 “加一”
算法·leetcode
kitesxian1 小时前
Leetcode437. 路径总和 III(HOT100)
算法·深度优先
YSRM1 小时前
异或-java-leetcode
java·算法·leetcode