代码随想录 -- 贪心 -- 合并区间

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

思路:

先按照左边界从大到小对数组进行排序;

遍历数组:如果当前遍历的区间左边界小于等于前一个区间的右边界,更新当前区间的左边界为最小的左边界,右边界为最大的右边界;如果没有重叠,就将前一个区间加入res中。

问题:最后一个区间没法加入res中,所以我在数组最后添加了一个元素[100000,100000]。

class Solution(object):
    def merge(self, intervals):
        intervals.sort(key=lambda x:(x[0],x[1]))
        intervals.append([100000,100000])
        res=[]
        for i in range(1,len(intervals)):
            if intervals[i][0]<=intervals[i-1][1]:
                intervals[i][0]=min(intervals[i-1][0],intervals[i][0])
                intervals[i][1]=max(intervals[i-1][1],intervals[i][1])
            else:
                res.append(intervals[i-1])
        return res

题解思路:

将排序后的第一个元素直接加入res中;

遍历数组:如果当前元素的左边界小于等于res中的最后一个元素的右边界,说明重叠,则更新res的最后一个元素的右边界为最大的右边界;否则直接将当前元素加入res中。

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

### 关于贪心算法的题解 #### 什么是贪心算法贪心算法是一种在每一步选择中都采取当前状态下最优策略的方法,从而希望最终能够达到全局最优解。这种方法并不总是有效,但在某些特定情况下可以得到正确的结果。 #### 贪心算法的应用场景 贪心算法通常适用于那些可以通过局部最优来实现整体最优的问题。例如,在分配资源、路径规划等问题中,如果每次都能做出最佳的选择,则可能获得全局的最佳解决方案[^2]。 #### 示例题解:分发饼干 (LeetCode 455) 给定两个数组 `g` 和 `s`,分别表示孩子们的胃口值和饼干尺寸。目标是尽可能多地满足孩子的胃口需求。 解决方法如下: 1. 将孩子的需求按从小到大的顺序排列。 2. 同样地,将饼干也按照大小排序。 3. 使用双指针逐一匹配最小的孩子需求与最小的可用饼干。 ```python def findContentChildren(g, s): g.sort() s.sort() child_index = cookie_index = 0 while child_index < len(g) and cookie_index < len(s): if s[cookie_index] >= g[child_index]: child_index += 1 cookie_index += 1 return child_index ``` 这段代码实现了上述逻辑,并返回能被满足的孩子数量。 #### 另一个例子:摆动序列 (LeetCode 376) 此问题的目标是从输入数组中找到最长的子序列,使得该子序列中的相邻元素交替上升下降。以下是基于贪心思想的一个 C++ 实现: ```cpp class Solution { public: int wiggleMaxLength(vector<int>& nums) { if (nums.size() <= 1) return nums.size(); int curdif = 0; int predif = 0; int result = 1; for (int i = 0; i < nums.size() - 1; ++i) { curdif = nums[i + 1] - nums[i]; if ((curdif > 0 && predif <= 0) || (curdif < 0 && predif >= 0)) { result++; predif = curdif; } } return result; } }; ``` 这里的关键在于利用差值的变化趋势判断是否构成有效的波动点[^3]。 #### 总结 虽然贪心算法不像动态规划那样有固定的模板,但它仍然遵循一定的设计原则——始终追求局部最优解并验证其能否导向全局最优解。对于初学者来说,掌握几个经典案例是非常重要的[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值