Day37 贪心第五天
LeetCode 56.合并区间
有了前两道题的经验,这道题思路就会很清晰。
这里的亮点是直接先把区间放进结果集里,然后直接在结果集里操作。
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> res;
if(intervals.size()==0) return res;
sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0] < b[0];});
res.push_back(intervals[0]);
for(int i=1;i<intervals.size();i++){
if(res.back()[1]>=intervals[i][0])
res.back()[1]=max(res.back()[1],intervals[i][1]);
else res.push_back(intervals[i]);
}
return res;
}
};
LeetCode 738.单调递增的数字
这道题还是很有意思的,分析之后贪心的思路是每两位比较,如果前比后大,就把前一位-1,后一位变成9,这样就取到了局部最大值,然后从最后一位开始逐位判断。
这里的flag是用来记录取9的最前的位置,也就是flag之后的位置全部要取9,如1000的话就要等到第一位才处理,但后面必须都要赋值成9,初值设置为数字长度是为了防止不需要做操作时误操作。
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string strNum=to_string(n);
int flag=strNum.size();
for(int i=strNum.size()-1;i>0;i--){
if(strNum[i-1]>strNum[i]){
flag=i;
strNum[i-1]--;
}
}
for(int i=flag;i<strNum.size();i++)
strNum[i]='9';
return stoi(strNum);
}
};
加油!