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]是负数,于是就分类讨论
即dp[i]
注意
这里状态的定义不是题目中的问题的定义,不能直接将最后一个状态返回回去。
class Solution:def maxSubArray(self, nums: List[int]) -> int:size = len(nums)if size == 0:return 0dp = [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