题目:
""" 给定一个整数数组 nums , 找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 """
法1:暴力求解(超出时间限制)
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
lst = []
for i in range(len(nums)):
sum = 0
for j in range(i,len(nums)):
sum += nums[j]
lst.append(sum)
return max(lst)
法2:贪心算法之双重比较
若当前元素之前之和小于0,则丢弃当前元素之数列。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
cur_sum = max_sum = nums[0]
for i in range(1,len(nums)):
cur_sum = max(nums[i],cur_sum+nums[i]) #比较当前值和sum
max_sum = max(cur_sum,max_sum) #比较历史最大值和当前最大值
return max_sum
nums = [-2,1,-3,4,-1,2,1,-5,4]
S = Solution()
result = S.maxSubArray(nums)
print(result)
法3:动态规划法
若前一个元素大于0,则加在当前元素上。
# 1.双重比较
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
pre_sum = max_sum = nums[0]
for i in range(1,len(nums)):
if pre_sum > 0:
pre_sum = nums[i] + pre_sum #所指元素sum
max_sum = max(pre_sum,max_sum) #比较最大值
else:
pre_sum = nums[i]
max_sum = max(pre_sum, max_sum)
return max_sum
#2.列出所有满足条件的sum
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
pre_sum = 0
lst = []
for i in range(0,len(nums)):
if pre_sum > 0:
pre_sum = nums[i] + pre_sum #所指元素sum
lst.append(pre_sum)
else:
pre_sum = nums[i]
lst.append(pre_sum)
return max(lst) #取列表中最大值
#3.用sum替换原位置的值
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
for i in range(1,len(nums)):
if nums[i-1] > 0:
nums[i] += nums[i-1] #用sum替换原位置的值
return max(nums) #取列表中最大值