首页 > 编程语言 >代码随想录算法训练营第三十七天 | 56.合并区间 738.单调递增的数字

代码随想录算法训练营第三十七天 | 56.合并区间 738.单调递增的数字

时间:2024-06-13 22:44:46浏览次数:22  
标签:vector return int 56 随想录 intervals 第三十七 区间 size

56.合并区间

题目链接 文章讲解 视频讲解

思路:
  按左区间排序;
  遍历所有区间,如果当前区间的左边界小于等于上一个区间的右边界,则合并区间(新区间的左边界为上一个区间的左边界,新区间的右边界为上一个区间的有边界和当前区间有边界中较大的一个)

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> result;
        sort(intervals.begin(), intervals.end(), [](vector<int>& lhs, vector<int>& rhs){ return lhs[0] < rhs[0]; });
        for(int i = 0; i < intervals.size(); ++i) {
            // 合并区间
            if(i > 0 && intervals[i][0] <= intervals[i - 1][1]) {
                intervals[i][0] = intervals[i - 1][0];
                intervals[i][1] = max(intervals[i - 1][1], intervals[i][1]);
            } else {
                // 区间不重复,将上一个区间添加到结果集中
                if(i > 0) {
                    result.push_back(intervals[i - 1]);
                } 
            }
             // 遍历到最后一个区间,直接将其添加到结果集中
            if(i == intervals.size() - 1) result.push_back(intervals[i]);
        }
        return result;
    }
};

738.单调递增的数字

题目链接 文章讲解 视频讲解

暴力解法

评价-->超时

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        while(n) {
            if(isIncreasing(n)) return n;
            n--;
        }
        return -1;
    }
    bool isIncreasing(int n) {
        int pre = n % 10;
        while(n) {
            n = n / 10;
            int cur = n % 10;
            if(pre < cur) return false;
            pre = cur;
        }
        return true;
    }
};

贪心

思路:
  从后向前遍历,如果当前数字比前一位数字小,则前一个数字减一(借位),当前位变为9
  特殊情况1000,如果不做处理的话,从后向前遍历会得到结果0900,转为数字后是900,不是最大的。
  所以用flag记录当前需要边为9的索引,从索引开始向右全部变为9,因为右边必须要大于等于左边,所以应全部变为9

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        string s_n = to_string(n);
        int flag = s_n.size();
        for(int i = s_n.size() - 1; i > 0; --i) {
            if(s_n[i] < s_n[i - 1]) {
                flag = i;
                s_n[i - 1]--;
            }
        }
        // 将flag向右的所有数字变为9
        for(int i = flag; i < s_n.size(); ++i) {
            s_n[i] = '9';
        }
    
        return stoi(s_n);
    }
};

标签:vector,return,int,56,随想录,intervals,第三十七,区间,size
From: https://www.cnblogs.com/cscpp/p/18246899

相关文章

  • 代码随想录算法训练营第九天 |
    151.反转字符串中的单词题目:给你一个字符串s,请你反转字符串中单词的顺序。单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。注意:输入字符串s中可能会存在前导空格、尾随空......
  • C138 线段树分治 P2056 [ZJOI2007] 捉迷藏
    视频链接:C138线段树分治P2056[ZJOI2007]捉迷藏_哔哩哔哩_bilibili   P2056[ZJOI2007]捉迷藏-洛谷|计算机科学教育新生态(luogu.com.cn)//线段树分治O(nlognlogn)#include<iostream>#include<cstring>#include<algorithm>#include<vector>#inclu......
  • 代码随想录第7天 |● 454.四数相加II●383. 赎金信●15. 三数之和●18. 四数之和●哈
    题目:454.四数相加Ⅱ思路:0.知道用map,但是map存啥1.暴力法,四层循环遍历哈哈哈哈2.分而治之,化繁为简,四个数组a,b,c,d分成两组,题目求符合要求的元祖个数,所以将a+b的值和出现次数存储,之后遍历查找c+d中0-(c+d)出现的次数,统计为结果时间复杂度:O(n^2)空间复杂度:O(n^2),最坏情况下A......
  • 2Gb 256Mx8 KTDM2G3C818BGCEAT KTDM2G3C818BGIEAT(SDRAM) KTM4GH1AHI01 KTM8GL1ASI01
    一、DDR3(L)SDRAM概述SMART’sDDR3(L)SDRAM组件与行业广泛兼容,并提供x8和x16配置。这些1.35v(DDR3L)和1.5V(DDR3)器件采用标准78和96引脚网格阵列封装,时钟速度为1866Mbps,密度为1Gb、2Gb和4Gb。宽/汽车工作范围器件也针对汽车AEC-Q1002类应用进行了测试和认证。DDR3(L)SDRAM......
  • 代码随想录算法训练营第10天 | 队列和栈基础知识、225用队列实现栈、用栈实现队列
    232用栈实现队列https://leetcode.cn/problems/implement-queue-using-stacks/用栈实现队列代码随想录https://programmercarl.com/0232.用栈实现队列.html#其他语言版本225用队列实现栈https://leetcode.cn/problems/implement-stack-using-queues/description/用队列实现......
  • CSP历年复赛题-P5663 [CSP-J2019] 加工零件
    原题链接:https://www.luogu.com.cn/problem/P5663题意解读:工人是图中的点,传送带是图中的无向边,给出q个询问a,l,判断是否能有一条1号点到a点的路径为l。解题思路:考试的关键是拿分!同样可以来面向数据编程:1、测试点 1∼4,1≤......
  • (天源)代理 TP4056 SOP-8 1A 锂电池充电器
    产品描述TP4056是一款单节锂离子电池恒流/恒压线性充电器,采用底部带散热片的SOP8封装以及简单的外部应用电路,非常适合便携式设备应用,适合USB电源和适配器电源工作,内部采用防倒充电路,不需要外部隔离二极管。热反馈可对充电电流进行自动调节,以便在大功率操作或高......
  • 代码随想录算法训练营第第36天 | 452. 用最少数量的箭引爆气球、435. 无重叠区间、763
    今天的三道题目,都算是重叠区间问题,大家可以好好感受一下。都属于那种看起来好复杂,但一看贪心解法,惊呼:这么巧妙!这种题还是属于那种,做过了也就会了,没做过就很难想出来。不过大家把如下三题做了之后,重叠区间基本上差不多了用最少数量的箭引爆气球https://programmercarl.co......
  • 代码随想录 算法训练营d7 哈希表 Leetcode454 四数相加2 Leetcode383 赎金信 Leetcode
    Leetcode454四数相加2 题目链接简单理解四个数组的数构成元组 相加为0思想:参考力扣第一题两数之和 才用哈希表解决问题通过将ab数组之和存储到哈希表中,并记录次数再通过计算-(c+d)去匹配哈希表如果存在那么count+=次数即可classSolution{publicintfour......
  • 代码随想录算法训练营第八天 | 344.反转字符串 541.反转字符串Ⅱ 卡玛网:54.替换数字
    344.反转字符串题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。解题:思路:双指针,秒了点击查看代码classSolution:defreverseString......