Q53. Maximum Subarray https://leetcode.com/problems/maximum-subarray/
idea: 暴力解法
找到所有subarray,记录具有最大sum的子数组。
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
max_sum = -float('inf')
for i in range(len(nums)):
temp_sum = 0
for j in range(i,len(nums)):
temp_sum += nums[j]
if temp_sum > max_sum:
start = i
end = j
max_sum = temp_sum
return sum(nums[start:end+1])
时间复杂度为O(N2),速度很慢。
discussion解决方案:动态规划!优秀的解决方案!
针对每一个元素,有两个部分需要关注:① “过去部分” pre_sum;② “当前部分”nums[i]本身
他可以有两种选择,① 加上pre_sum,本身融入到子串当中;② 以“当前部分”为子串起始位置,完全抛弃“过去部分”。
到底该怎么选择呢?那就是:如果 pre_sum<0,那就选择方案②,否则选择方案①。用程序表达起来就是:
max(pre_sum+nums[i],nums[i])
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
sub_sum = nums[0]
max_sum = nums[0]
for i in range(1,len(nums)):
sub_sum = max(sub_sum + nums[i],nums[i])
if sub_sum > max_sum:
max_sum = sub_sum
return max_sum
动态规划的思想就是,上一个状态的结果影响下一个状态的结果,找到每一个状态的最优方案。