leetcode-top100数组专题

53.最大子数组和

题目链接

53. 最大子数组和 - 力扣(LeetCode)

解题思路

dp[i]:表示以nums[i]结尾的连续子数组的最大和。其中“连续”和“结尾”时关键词。

状态转移方程

根据状态的定义,由于nums[i]一定会被选取,并且以nums[i]结尾的连续子数组与以nums[i -1]结尾的连续子数组只相差一个元素nums[i]。

假设数组nums的值全都严格大于0,那么一定有dp[i] = dp[i - 1] + nums[i]。

可以如果dp[i - 1]是负数,于是就分类讨论

leetcode-top100数组专题_第1张图片

即dp[i]

注意

这里状态的定义不是题目中的问题的定义,不能直接将最后一个状态返回回去。

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        size = len(nums)
        if size == 0:
            return 0
        dp = [0 for _ in range(size)]

        dp[0] = nums[0]
        for i in range(1,size):
            dp[i] = max(dp[i - 1] + nums[i],nums[i])
        return max(dp)

56.合并区间

题目链接

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

解题思路

我们使用数组merged存储最终的答案。
首先,我们将列表中的区间按照左端点升序排序。然后我们将第一个区间加入merged数组中,并按顺序依次考虑之后的每个区间:

如果当前区间的左端点在数组merged中最后一个区间的右端点之后,那么他们不会重合,我们可以直接将这个区间加入数组merged的末尾;
否则,他们重合,我们需要用当前区间的右端点更新数组merged中最后一个区间的右端点,将其置为二者的较大值。

解题代码

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.sort(key = lambda x : x[0])

        merged = []
        for interval in intervals:
            #如果列表为空,或者当前区间与上一区间不重合,直接添加
            if not merged or merged[-1][1] < interval[0]:
                merged.append(interval)
            else:
                #否则的话,我们就可以与上一区间进行合并
                merged[-1][1] = max(merged[-1][1],interval[1])

        return merged

你可能感兴趣的:(leetcode,算法,数据结构)