題目鏈接:https://leetcode-cn.com/problems/maximum-subarray/
描述:給定一個(gè)整數(shù)數(shù)組 nums ,找到一個(gè)具有最大和的連續(xù)子數(shù)組(子數(shù)組最少包含一個(gè)元素),返回其最大和。
示例:
輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續(xù)子數(shù)組 [4,-1,2,1] 的和最大,為 6。
- 解法一: 采用動(dòng)態(tài)規(guī)劃,把每一次的滑動(dòng)的最大值記錄下來(lái)。
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if nums == None or len(nums) == 0:
return None
slist = [nums[0]]
max_sum = nums[0]
for i in range(1, len(nums)):
if slist[i - 1] > 0:
slist.append(slist[i - 1] + nums[i])
else:
slist.append(nums[i])
if max_sum < slist[i]:
max_sum = slist[i]
return max_sum
- 解法二: 在DP上優(yōu)化。其實(shí)DP數(shù)組也是記錄s。
如果 s > 0,則說(shuō)明 s 對(duì)結(jié)果有增益效果,則 s 保留并加上當(dāng)前遍歷數(shù)字
如果 s <= 0,則說(shuō)明 s 對(duì)結(jié)果無(wú)增益效果,需要舍棄,則 s 直接更新為當(dāng)前遍歷數(shù)字。
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if nums == None or len(nums) == 0:
return None
max_sum = nums[0]
s = 0
for i in range(len(nums)):
if s > 0:
s += nums[i]
else:
s = nums[i]
max_sum = max(max_sum, s)
return max_sum