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

相关推荐
予早几秒前
LeetCode 149. 直线上最多的点数
算法·leetcode
诚丞成2 分钟前
算法的时间复杂度和空间复杂度
开发语言·数据结构·算法
苏格拉没有底11112 分钟前
数据结构——顺序表、链表
c语言·开发语言·数据结构·笔记·学习·算法·链表
进击的_鹏14 分钟前
数据结构之顺序表
c语言·数据结构
昭著19 分钟前
优先级队列(堆)
java·数据结构
抓哇能手21 分钟前
王道408考研数据结构-树与二叉树-第五章-第三四节
c语言·数据结构·考研·算法·408
DdddJMs__13521 分钟前
C语言 | Leetcode C语言题解之第429题N叉树的层序遍历
c语言·leetcode·题解
Liusp1 小时前
数据结构和算法之树形结构(3)
数据结构·算法
Ddddddd_1581 小时前
C++ | Leetcode C++题解之第432题全O(1)的数据结构
c++·leetcode·题解
NuyoahC1 小时前
数据结构之图的遍历
数据结构·深度优先·图的遍历