题目链接:56. 合并区间、738.单调递增的数字、968.监控二叉树
文章链接:代码随想录
贪心算法
1. 合并区间
(待更新...)
cpp
class Solution {
private:
static bool cmp(const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
}
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> result;
if(intervals.size() == 0) return result;
sort(intervals.begin(), intervals.end(), cmp);
for(int i = 1; i < intervals.size(); i++) {
if(intervals[i][0] <= intervals[i - 1][1]){
intervals[i][0] = min(intervals[i][0], intervals[i - 1][0]);
intervals[i][1] = max(intervals[i][1], intervals[i - 1][1]);
} else {
result.push_back(intervals[i - 1]);
}
}
result.push_back(intervals[intervals.size() - 1]);
return result;
}
};
2. 单调递增的数字
(待更新...)
cpp
/*
本题思路:
从后往前遍历,如果前一位数比后一位数小,则将前一位数减1,从后一位数到最后一位数都变成9
从而保证最后的整数是最大的单调递增数
*/
class Solution {
public:
int monotoneIncreasingDigits(int num) {
string strNum = to_string(num);
int flag = strNum.size();
// flag用来标记赋值9从哪里开始
// 设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行
for(int i = strNum.size() - 1; i > 0; i--) {
if(strNum[i] < strNum[i - 1]) {
strNum[i - 1]--;
flag = i;
}
}
for(int i = flag; i < strNum.size(); i++) {
strNum[i] = '9';
}
return stoi(strNum);
}
};
3. 监控二叉树(提高)
(待更新...)
4. 总结
(待更新...)
相关题目和后续提高: