【c++刷题笔记-贪心】day30:56. 合并区间 、 738.单调递增的数字

56. 合并区间 - 力扣(LeetCode)

思路:覆盖区间问题,先排序再判断边界

重点:二维数组可以使用back()函数直接更换边界值

cpp 复制代码
class Solution {
public:
    static bool cmp(const vector<int>& a,const vector<int>& b){
        return a[0]<b[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end(),cmp);
        vector<vector<int>>ans;
        int n=intervals.size();
        ans.push_back(intervals[0]);//第一个区间直接放
        for(int i=1;i<n;i++){
            if(ans.back()[1]>=intervals[i][0]){
                ans.back()[1]=max(ans.back()[1],intervals[i][1]);//更新右边界
            }else{
                ans.push_back(intervals[i]);
            }
        }
        return ans;
    }
};

738. 单调递增的数字 - 力扣(LeetCode)

思路:先转换为字符串,前一个数小于当前数的时候前一个数减一,当前数替换为'9'

重点:从后向前遍历使用flag记录需要替换的下标

cpp 复制代码
class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        if(n<=9){
            return n;
        }
        string s=to_string(n);
        int m=s.size();
        int flag=m;
        for(int i=m-1;i>0;i--){
            if(s[i-1]>s[i]){
                flag=i;
                s[i-1]--;
            }
        }
        for(int i=flag;i<m;i++){
            s[i]='9';
        }
        return stoi(s);
    }
};

总结

贪心算法,需要一定的技巧,覆盖区间可以直接用back()函数修改右边界。修改数字可以使用flag来记录需要修改的数字的下标

相关推荐
一只小逸白4 分钟前
LeetCode Go 常用函数速查表
linux·leetcode·golang
夏日听雨眠5 分钟前
数据结构(堆排序,基数排序)
数据结构·算法
什仙5 分钟前
Ansys Maxwell 默认求解器选择
人工智能·笔记·算法·基础·ansys·maxwell
清平乐的技术专栏6 分钟前
【Kafka笔记】(二)核心架构与专属名词解释
笔记·架构·kafka
weixin_3077791311 分钟前
基于Vosk与CTranslate2的实时语音识别翻译系统 —— 完整C++实现详解
人工智能·算法·自动化·语音识别·原型模式
清平乐的技术专栏12 分钟前
【Kafka笔记】(三)常用命令整理
笔记·分布式·kafka
akarinnnn14 分钟前
深入理解内存函数:原理、应用与优化
c语言·网络·数据结构·算法
Hua-Jay15 分钟前
OpenCV联合C++/Qt 学习笔记(二十四)----差值法检测移动物体、稠密光流法跟踪移动物体及稀疏光流法跟踪移动物体
c++·笔记·qt·opencv·学习·计算机视觉
清平乐的技术专栏22 分钟前
【FlinkSQL笔记】(一)什么是Flink SQL
笔记·sql·flink
一行代码一行诗++22 分钟前
for循环中的break和continue
数据结构·算法