刷题笔记Day31贪心算法part05

刷题笔记Day30:贪心算法part04

题目:合并区间

56. 合并区间 - 力扣(LeetCode)

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

思路:本体的思路和昨天的几道题目相同,利用此刻元素的左边界和上一刻元素的右边界进行对比,若右边界大说明有交集,若右边界小说明没有交集;若有交集则判断两个元素的右边界谁大,将大的作为此刻元素的右边界从而方便和下一个元素进行对比。此题用了一个比较巧妙的方式从而避免了在intervals中对元素进行操作,题解中给了一个result数组,若有交集则更新数组最后一个元素的右边界值,若没交际则直接将这个元素push到数组的末尾。同时,比较的对象也从上一个元素变为了和result数组当前的末尾元素。

class Solution {
public:
    static bool cmp(const vector<int>& a,const vector<int>& b){
        if(a[0] == b[0])    return a[1] < b[1];
        return a[0] < b[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end(),cmp);
        vector<vector<int>> result;
        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;
        
    }
};

题目:单调递增的数字

738. 单调递增的数字 - 力扣(LeetCode)

当且仅当每个相邻位数上的数字 xy 满足 x <= y 时,我们称这个整数是单调递增的。

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增

示例 1:

输入: n = 10
输出: 9

思路:每次对比此刻位和小一位的值若呈现当掉单调递增则不用有动作,若呈现递减,则将此刻的值减一,之后再将小一位的值变为9。

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        string s = to_string(n);
        int flag = s.size();
        for(int i = s.size()-1;i >0 ;i--){
            if(s[i] < s[i-1])
            {
                s[i-1] --;
                flag = i;
            }
        }
        for(int i = flag; i < s.size();i++)
        {
            s[i] = '9';
        }
        return stoi(s);
    }
};
posted @ 2025-04-26 00:34  涛Tao  阅读(24)  评论(0)    收藏  举报