文章链接: 56. 合并区间 738.单调递增的数字

视频链接: 56. 合并区间 738.单调递增的数字

题目链接: 56. 合并区间 738.单调递增的数字


56.合并区间

思路:

1.将区间根据左边界排序;

2.将第一个区间放入结果集中,便于以后的合并;

3.遍历到与结果集最后一个区间重叠的区间就更新右边界;

3.遍历到与结果集最后一个区间不重叠的区间就直接放入结果集中。

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) {
        vector<vector<int>> result;
        if (intervals.size() == 0) return result;
        sort(intervals.begin(), intervals.end(), cmp); // 根据左边界排序

        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;
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.


738.单调递增的数字

思路:

从后往前遍历,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),就让strNum[i - 1]--,然后strNum[i]给为9;

注意:

要用一个flag记录一下,便于将flag后的都赋值为9。

为什么要这样做?举列子:1000。

如果只是将非递增的部分的后一位变为9,而不去管其他的,那么得到的是900,但900并不是最终的答案,999才是。

class Solution {
public:
    int monotoneIncreasingDigits(int N) {
        string strNum = to_string(N);
        // flag用来标记赋值9从哪里开始
        // 设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行
        int flag = strNum.size();
        for (int i = strNum.size() - 1; i > 0; i--) {
            if (strNum[i - 1] > strNum[i] ) { // 非单调递增的情况
                strNum[i - 1]--;
                flag = i;
            }
        }
        for (int i = flag; i < strNum.size(); i++) { // flag后的都赋值为9
            strNum[i] = '9';
        }
        return stoi(strNum);
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.