56.合并区间
要点:找重叠区间。如果区间不重叠,直接push前一元素;如果区间重叠,将当前元素和前一元素合并;如果遍历到最后一个了,直接push
class Solution {
static bool cmp(vector<int>& a, vector<int>& b) { return a[0] < b[0]; }
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if (intervals.size() == 1)
return intervals;
sort(intervals.begin(), intervals.end(), cmp);
vector<vector<int>> result;
for (int i = 1; i < intervals.size(); i++) {
if (intervals[i][0] > intervals[i - 1][1]) {
result.push_back(intervals[i - 1]);
} else {
intervals[i][0] = min(intervals[i][0], intervals[i - 1][0]);
intervals[i][1] = max(intervals[i][1], intervals[i - 1][1]);
}
if (i == intervals.size() - 1) {
result.push_back(intervals[i]);
}
}
return result;
}
};
738.单调递增的数字
要点:从后往前遍历,当前位如果比前一位小,就不满足相邻位单调增,所以当前位变成9,前一位减1;但是会有‘100’,‘101’,这种怪数字出现,就需要引入一个flag来标记,从哪一位开始,往后全部变成9
class Solution {
public:
int monotoneIncreasingDigits(int n) {
if (n < 10)
return n;
string strNum = to_string(n);
int flag = strNum.size();
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);
}
};