刷题笔记Day31贪心算法part05
刷题笔记Day30:贪心算法part04
题目:合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
思路:本体的思路和昨天的几道题目相同,利用此刻元素的左边界和上一刻元素的右边界进行对比,若右边界大说明有交集,若右边界小说明没有交集;若有交集则判断两个元素的右边界谁大,将大的作为此刻元素的右边界从而方便和下一个元素进行对比。此题用了一个比较巧妙的方式从而避免了在intervals中对元素进行操作,题解中给了一个result数组,若有交集则更新数组最后一个元素的右边界值,若没交际则直接将这个元素push到数组的末尾。同时,比较的对象也从上一个元素变为了和result数组当前的末尾元素。
class Solution {
public:
static bool cmp(const vector<int>& a,const vector<int>& b){
if(a[0] == b[0]) return a[1] < b[1];
return a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),cmp);
vector<vector<int>> result;
result.push_back(intervals[0]);
for(int i = 1 ; i < intervals.size();i++){
if(result.back()[1] >= intervals[i][0]){
result.back()[1] = max(result.back()[1],intervals[i][1]);
}
else{
result.push_back(intervals[i]);
}
}
return result;
}
};
题目:单调递增的数字
当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。
给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
示例 1:
输入: n = 10
输出: 9
思路:每次对比此刻位和小一位的值若呈现当掉单调递增则不用有动作,若呈现递减,则将此刻的值减一,之后再将小一位的值变为9。
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string s = to_string(n);
int flag = s.size();
for(int i = s.size()-1;i >0 ;i--){
if(s[i] < s[i-1])
{
s[i-1] --;
flag = i;
}
}
for(int i = flag; i < s.size();i++)
{
s[i] = '9';
}
return stoi(s);
}
};

浙公网安备 33010602011771号