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

写代码的第二十七天

最后一天贪心!!!加油呀!!!

56. 合并区间

思路

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

python 复制代码
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类型。

python 复制代码
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!!!!

python 复制代码
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))

正确代码

python 复制代码
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))

总结

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

相关推荐
BB_CC_DD20 分钟前
四. 以Annoy算法建树的方式聚类清洗图像数据集,一次建树,无限次聚类搜索,提升聚类搜索效率。(附完整代码)
深度学习·算法·聚类
梁下轻语的秋缘2 小时前
每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)
c++·算法·蓝桥杯
CODE_RabbitV2 小时前
【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)
算法
mit6.8242 小时前
[贪心_7] 最优除法 | 跳跃游戏 II | 加油站
数据结构·算法·leetcode
keep intensify2 小时前
通讯录完善版本(详细讲解+源码)
c语言·开发语言·数据结构·算法
shix .2 小时前
2025年PTA天梯赛正式赛 | 算法竞赛,题目详解
数据结构·算法
风铃儿~3 小时前
Java面试高频问题(26-28)
java·算法·面试
wuqingshun3141593 小时前
蓝桥杯 4. 卡片换位
算法·职场和发展·蓝桥杯
江沉晚呤时3 小时前
深入了解C# List集合及两种常见排序算法:插入排序与堆排序
windows·sql·算法·oracle·c#·排序算法·mybatis
Eric.Lee20213 小时前
数据集-目标检测系列- F35 战斗机 检测数据集 F35 plane >> DataBall
人工智能·算法·yolo·目标检测·计算机视觉