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