【力扣刷题 | 第二十三天】

目录

前言:

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

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

总结:


前言:

        今天我们依然暴打贪心算法

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

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

 解题思路:其实这道题和我们之前刷的最少弓箭射爆气球和无重叠区间是很类似的,本质上就是先对区间进行排序,之后如果上一个区间的有右区间大于等于下一个区间的左区间,那么我们就对这两个区间进行重叠,新的右区间取两个右区间的最大值。

大的框架就是对整个数组进行判断,如果重叠了就进行合并,之后再与下一个数组进行判断是否重叠,如果不重叠了,我们就把当前区间存入数组之中,进行判断下一个区间。

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(intervals[i][0]<=result.back()[1])
            {
                result.back()[1]=max(intervals[i][1],result.back()[1]);
                //只更新左边界,因为右边界我们进行过排序,右边界就是从大到小进行排序的。
            }
            else
            {
                result.push_back(intervals[i]);
            }
        }        
        return result;
    }
};

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

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

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

 这道题给的数据比较简单,正常人可能会想到暴力拆分数字进行判断,但是暴力求解会超时。

暴力求解就是对这个数值从大向小开始遍历,如果得到的数值符合要求,我们就输出这个数值。

暴力解法:会超时 

class Solution {
private:
    
    bool checkNum(int num) {
        int max = 10;
        while (num) {
            int t = num % 10;
            if (max >= t) max = t;
            else return false;
            num = num / 10;
        }
        return true;
    }
public:
    int monotoneIncreasingDigits(int N) {
        for (int i = N; i > 0; i--) { // 从大到小遍历
            if (checkNum(i)) return i;
        }
        return 0;
    }
};

 贪心算法思路:

对这个数字进行逐位分析,如果前一位小于后一位,那么前一位减一,后一位变为最大值9。而遍历顺序我们按照从后往前进行遍历,因为从后往前符合我们要求数字递增的条件(不理解的可以手动尝试一遍)。

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        string str = to_string(n);
       
        int flag=str.size();
        for(int i=str.size()-1;i>0;i--)
        {
            if(str[i-1]>str[i])
            {
                
            str[i-1]--;
               flag = i;

            }
        }
        for(int i=flag;i<str.size();i++)
        {
            str[i]='9';
        }

          return stoi(str);
    }   
};

总结:

        做题的时候应该先跳脱出算法的框架,先想着怎么能够把这道题解出来,无论是暴力算法还是什么,先力保把题做出来,再谈优化时间复杂度什么的。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

猜你喜欢

转载自blog.csdn.net/fckbb/article/details/132073057