代码随想录一刷记录Day31——leetcode56. 合并区间 738.单调递增的数字

前言

之前就有刷代码随想录,但奈何总是三天打鱼两天晒网,而且刷的也很囫囵吞枣,于是乎决定参加代码随想录训练营,准备精刷一遍,希望自己能坚持下去,结营后自己的算法水平能更上一个level,冲ing!

leetcode56. 合并区间

题目链接leetcode56. 合并区间

思路

本题和之前的452. 用最少数量的箭引爆气球和 435. 无重叠区间都是一个套路,只是在判断出重叠区间后多了将重叠区间合并的要求。

具体思路:依然是先对区间按左边界排序,然后将第一个区间先放进结果集中,后面如果有重叠,直接在result中合并,然后就是循环中判断重叠,如果有重叠 (当前区间左边界<=result.back的右边界,进行合并:合并的思路是直接更新右边界,因为result.back()的左边界一定是最小值,因为之前已经按照左边界排序了),如果没重叠,直接将当前区间放进result中。

代码

cpp 复制代码
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> result;
        if (intervals.size() == 0) return result; // 区间集合为空直接返回
        // 排序的参数使用了lambda表达式
        sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0] < b[0];});

        // 第一个区间就可以放进结果集里,后面如果重叠,在result上直接合并
        result.push_back(intervals[0]); 

        for (int i = 1; i < intervals.size(); i++) {
            if (result.back()[1] >= intervals[i][0]) { // 发现重叠区间
                // 合并区间,只更新右边界就好,因为result.back()的左边界一定是最小值,因为我们按照左边界排序的
                result.back()[1] = max(result.back()[1], intervals[i][1]); 
            } else {
                result.push_back(intervals[i]); // 区间不重叠 
            }
        }
        return result;
    }
};

leetcode738.单调递增的数字

题目链接leetcode738.单调递增的数字

思路

以98为例,如何找到小于该数的最大递增数字?一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。另外还要考虑遍历顺序,只有从后向前遍历才能重复利用上次比较的结果。

最后代码实现的时候,需要用一个flag来标记从哪里开始赋值9。

代码

cpp 复制代码
class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        string strNum = to_string(n);
        // flag用来标记赋值9从哪里开始
        // flag设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行
        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);        
    }
};
相关推荐
流年如夢15 分钟前
栈和列队(LeetCode)
数据结构·算法·leetcode·链表·职场和发展
小小de风呀39 分钟前
de风——【从零开始学C++】(五):内存管理
开发语言·c++
Hello.Reader1 小时前
算法基础(十)——分治思想把大问题拆成小问题
java·开发语言·算法
CHANG_THE_WORLD2 小时前
C语言中的 %*s 和 %.*s 和C++的字符串格式化输出
c语言·c++·c#
绛橘色的日落(。・∀・)ノ2 小时前
机器学习之评估与偏差方差分析
算法
消失的旧时光-19432 小时前
C语言对象模型系列(四)《Linux 内核里的 container_of 到底是什么黑魔法?》—— 一篇讲透 Linux 内核的“对象模型”核心技巧
linux·c语言·算法
AI_Ming3 小时前
从0开始学AI:层归一化,原来是这回事!
算法·ai编程
WL_Aurora3 小时前
备战蓝桥杯国赛【Day 8】
算法·蓝桥杯
螺丝钉的扭矩一瞬间产生高能蛋白3 小时前
QT的C++接口基础用法
c++·qt·嵌入式软件·嵌入式linux·linux应用
智者知已应修善业3 小时前
【51单片机模拟生日蜡烛】2023-10-10
c++·经验分享·笔记·算法·51单片机