代码随想录–贪心算法
day 31 休息
day 32 贪心算法第五天
一、力扣56–合并区间
代码随想录题目链接:代码随想录
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
思路很清楚了,就是以start排序,接着判断是否重叠,重叠就合并,一直到不重叠时把这个合并区间输出
实际操作中尾部元素不好判断,所以加入一个虚拟的尾节点,这样就能统一判断了
代码如下:
class Solution {
public:
static bool cmp(vector<int> a, vector<int> b)
{
return a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if(intervals.size() <= 1) return intervals;
sort(intervals.begin(), intervals.end(), cmp);
vector<vector<int>> result;
vector<int> path = intervals[0];
intervals.push_back({INT_MAX, INT_MAX}); // dummy tail
for(int i = 1 ; i < intervals.size(); i ++)
{
if(intervals[i][0] <= path[1])
{
path[1] = max(intervals[i][1], path[1]);
}
else
{
result.push_back(path);
path = intervals[i];
}
}
return result;
}
};
二、力扣738–单调递增的数字
代码随想录题目链接:代码随想录
当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。
给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
贪心算法的贪心在于让这个数字的第一位最大,再遍历后面每位都最大
约束在于结果数递增,以及n设定了上限
方便的做法是从后向前遍历,如果i-1位的数字比i位大了,那么此时并不是递增数
此时把i-1位的数字减一,并把i位数字设置为9,这样既能满足总体小于n,又满足自身是递增数
但是这样会在“100”这里失败
最后输出是90,所以实际上应该将 i 到尾巴的所有数都设置成9
代码如下:
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string s = to_string(n);
int index = s.size();
for(int i = s.size() - 1; i > 0; i --)
{
if(s[i - 1] > s[i])
{
s[i - 1] --;
index = i;
}
}
for(int i = index; i < s.size(); i ++) s[i] = '9';
return stoi(s);
}
};
总结
贪心算法就是看今天脑子好不好用,灵光一现就做出来了,比如今天,没灵感的话就没办法了,只能多刷多做多总结