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

相关推荐
github_czy18 分钟前
RRF (Reciprocal Rank Fusion) 排序算法详解
算法·排序算法
许愿与你永世安宁1 小时前
力扣343 整数拆分
数据结构·算法·leetcode
爱coding的橙子1 小时前
每日算法刷题Day42 7.5:leetcode前缀和3道题,用时2h
算法·leetcode·职场和发展
满分观察网友z1 小时前
从一次手滑,我洞悉了用户输入的所有可能性(3330. 找到初始输入字符串 I)
算法
YuTaoShao2 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
Heartoxx2 小时前
c语言-指针(数组)练习2
c语言·数据结构·算法
大熊背2 小时前
图像处理专业书籍以及网络资源总结
人工智能·算法·microsoft
满分观察网友z2 小时前
别怕树!一层一层剥开它的心:用BFS/DFS优雅计算层平均值(637. 二叉树的层平均值)
算法
杰克尼3 小时前
1. 两数之和 (leetcode)
数据结构·算法·leetcode
YuTaoShao4 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展