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

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

时间:2024-08-02 08:55:41浏览次数:15  
标签:int list 56 随想录 len range intervals result 738

写代码的第二十七天
最后一天贪心!!!加油呀!!!

56. 合并区间

思路

这道题本质上和昨天的两道题是几乎完全一致的,都是判断重叠区间,只不过昨天的射箭那道题是统计有多少重叠区间,无重叠区间那道题是找到重叠区间然后删除,这道题是找到重叠区间然后合并。
解决问题1:如何对重叠区间进行合并?我们对整个数组根据左下标进行了从小到大的排序,所以排序后的数组左下标一定保持着从小到大的情况,所以合并后的区间左侧边界是不用管的,一定是第i位数组的左下标。右下标就是相邻比较的数组中大的那个右下标。需要注意,我们进行修改的区间都是在输出数组result的基础上进行修改,而不是在数组中对单独的某一位进行修改!!!所以对于右下标的数值比较都是在result[-1][1]的基础上进行修改的,也都是和他进行比较的。
正确代码

class Solution:
    def merge(self, intervals):
        result = []
        intervals.sort(key=lambda x: x[0]) 
        result.append(intervals[0])  
        for i in range(1, len(intervals)):
            if result[-1][1] >= intervals[i][0]: 
                result[-1][1] = max(result[-1][1], intervals[i][1])
            else:
                result.append(intervals[i]) 

        return result

738.单调递增的数字

思路

先理解一下题意:给一个数字,找到比这个数字小,但是又能单调递增的这么个数字。
如果说本来这个数字就满足上面的条件,那就直接输出,啥也不用改;如果说数字中存在相邻的数字左边的比右边大这种情况,那么让左边的-1,右边的数字变9;那是选择从哪个方向开始遍历呢,如果从左到右遍历的话,那么比如是332,3和3相比单调递增,不用动,3和2相比3大于2那么3-1,2变9,得到结果是329,很明显结果不对;如果是右到左遍历,呢么3大于2,3-1,2变9,得到329,再继续3大于2,3-1,2变9,得到299,正确结果。
错误第一版:int类型不能直接转换成list类型,应该是先转换成str类型再转换成list类型。list的倒叙range是range(len(n)-1,0,-1)。后面的n[i-1] = n[i-1] - 1这里也不能直接用str类型-1,应该转换成int类型。

class Solution:
    def monotoneIncreasingDigits(self, n: int) -> int:
        n = list(n)
        for i in range(len(n)-1,-1,-1):
            if n[i] < n[i-1]:
                n[i-1] = n[i-1] - 1
                n[i] = '9'
        return int(''.join(n))

错误第二版:输出结果错误。当输入为100的时候我的结果是90,正确的结果应该是99.所以不应该是只改变一位变成9,而是后面的所有数字都变成9!!!!

class Solution:
    def monotoneIncreasingDigits(self, n: int) -> int:
        n = list(str(n))
        for i in range(len(n)-1,0,-1):
            if n[i] < n[i-1]:
                n[i-1] = str(int(n[i-1]) - 1)
                n[i] = '9'
        return int(''.join(n))

正确代码

class Solution:
    def monotoneIncreasingDigits(self, n: int) -> int:
        n = list(str(n))
        for i in range(len(n)-1,0,-1):
            if n[i] < n[i-1]:
                n[i-1] = str(int(n[i-1]) - 1)
                for j in range(i,len(n)):
                    n[j] = '9'
        return int(''.join(n))

总结

贪心这一章很痛苦,自己几乎没有想出来哪道题,都是看着题解理解了写出来的,而且没有套路可找,总感觉逻辑很牵强,而且有些写法真的我的水平自己是完全想不出来的,总会想的很复杂,代码水平太次了,还得继续努力。。。

标签:int,list,56,随想录,len,range,intervals,result,738
From: https://blog.csdn.net/MYSTICSHUN/article/details/140862098

相关文章

  • 右下角wifi图案点击无可用wifi/更新网卡驱动时遇到错误代码56的解决办法
    1.问题如下图所示,我这里遇到明明有wifi,但是无法检索到任何有用wifi的情况。2.解决方法参考:电脑WIFI消失,网卡驱动Intel(R)Wi-Fi6AX201160MHz感叹号报错解决方案集合——无线WI-FI功能缺失,Intel(R)Wi-Fi6AX201160MHz异常,驱动更新错误2.1问题原因当时更新驱动更到......
  • P5665 [CSP-S2019] 划分
    思路:首先求出\(a\)的前缀和数组\(s\)。考虑动态规划,令\(dp_{i,j}\)表示以\(i\)结尾,末尾有\(j\)个为一组的最小答案,则状态转移方程为:\[dp_{i,j}=\min[s_{i-j}-s_{i-j-k}\les_i-s_{i-j}]dp_{i-j,k}+(s_i-s_{i-j})^2\]朴素直接转移是\(O(N^3)\)的,可以得到......
  • 「代码随想录算法训练营」第二十六天 | 贪心算法 part4
    452.用最少数量的箭引爆气球题目链接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/题目难度:中等文章讲解:https://programmercarl.com/0452.用最少数量的箭引爆气球.html视频讲解:https://www.bilibili.com/video/BV1SA41167xe题目状态:有点思路......
  • 「代码随想录算法训练营」第二十五天 | 贪心算法 part3
    134.加油站题目链接:https://leetcode.cn/problems/gas-station/题目难度:中等文章讲解:https://programmercarl.com/0134.加油站.html视频讲解:https://www.bilibili.com/video/BV1jA411r7WX题目状态:没有思路,学习题解思路一:全局最优解首先将所有路径的加油量和耗油量加一起......
  • 代码随想录Day2
    209.长度最小的子数组给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的子数组$[nums_l,nums_{l+1},...,nums_{r-1},nums_r]$,并返回其长度。如果不存在符合条件的子数组,返回0。示例1:输入:target=7,nums=......
  • python中  datetime.now() 获取当前时间 例如:2023-04-01 12:34:56.789012
    问:python中 datetime.now()获取当前时间例如:2023-04-0112:34:56.789012答:在Python中,datetime.now()函数是用来获取当前日期和时间的。但是,需要注意的是,这个函数是datetime模块中datetime类的一个方法,因此你需要从datetime模块中导入datetime类(尽管这看起来有点......
  • 代码随想录算法训练营第56天 | 广搜和深搜应用
    110.字符串接龙https://kamacoder.com/problempage.php?pid=1183代码随想录https://www.programmercarl.com/kamacoder/0110.字符串接龙.html#思路105.有向图的完全可达性https://kamacoder.com/problempage.php?pid=1177代码随想录https://www.programmercarl.com/kamaco......
  • 代码随想录算法训练营day01|704. 二分查找,27. 移除元素,977.有序数组的平方
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/description/本人代码:classSolution{public:intsearch(vector<int>&nums,inttarget){intlow=0,high=nums.size()-1;//此处分情况讨论returnsearchTarget(nums,low,high,tar......
  • 代码随想录day16 || 513 树左下角值,112 路径之和,116 中序后序遍历构造二叉树
    切片传递问题question:什么情况下传递切片,什么情况下传递切片指针,为什么有时候会修改原始副本,有时候又不会呢?typesli[]intfuncmain(){ slice:=[]int{1} fmt.Printf("slice:%p\n",slice) change1(slice) fmt.Println("=================================") s2:=......
  • 每日一题——A - Max/Min AtCoder - abc356_e
    1.题目大意:枚举两个数的Max/Min向下取整之和。2.思路:一开始并没有想时间复杂度问题发现通过sort()排序来遍历每个最小值Min和后面最大值的和就是题目答案。你会发现仍然有问题,那就是取整的问题你就必须要优化然后发现很明显超时了。现在我们来换一个角度思考。搭配前缀和嘛。为......