欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 【c++刷题笔记-贪心】day30:56. 合并区间 、 738.单调递增的数字

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

2024/10/24 16:28:14 来源:https://blog.csdn.net/qq_48662659/article/details/140229782  浏览:    关键词:【c++刷题笔记-贪心】day30:56. 合并区间 、 738.单调递增的数字

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

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

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

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记录需要替换的下标

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来记录需要修改的数字的下标

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com