53. 最大子数组和

"""
53. 最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。

示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:

输入:nums = [5,4,-1,7,8]
输出:23
"""

"""
bp的定义:利用动态规划的解法,定义dp数组为:dp[i]为以num[i]为结尾的最大数组和
转移方程为:dp[i] = max(num[i], dp[i-1] + num[i])表示是否与前面的相邻子数组连接
dp case: dp[0] = num[0]
"""
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
nums_size = len(nums)
bp = [nums[i] for i in range(nums_size)]
print(bp)
for i in range(1, nums_size):
bp[i] = max(bp[i], bp[i - 1] + nums[i])

res = float('-inf')
for i in bp:
res = max(res, i)
return res

#状态压缩
def maxSubArray1(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
nums_size = len(nums)
if nums_size < 1: return 0
if nums_size == 1: return nums[0]
res, first, second = nums[0], nums[0], nums[0]
for i in range(1, nums_size):
second = max(nums[i], first + nums[i])
res = max(res, second)
first = second
return res



if __name__ == "__main__":
nums = [-1,-2]
res = Solution().maxSubArray1(nums)
print(res)

posted on 2021-12-14 10:19  random_boy  阅读(65)  评论(0)    收藏  举报

导航