1.编辑器
我使用的是win10+vscode+leetcode+python3
环境配置参见我的博客:
链接
2.第五十三题
(1)题目
英文:
Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
中文:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
(2)解法
① 先从第一位开始,逐位开始计算子数组和,如果遇到前一个sum1为负,则直接抛弃前面所有的子数组,开始新的子数组探索,每过一个num,都要比较出最大的和。
(耗时:40ms,内存:14.2M)
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
max1, sum1 = nums[0], nums[0]
for num in nums[1:]:
sum1 = sum1 + num if sum1 >= 0 else num
max1 = max1 if max1 > sum1 else sum1
return max1
② 使用动态规划,本质上就是从indx=0开始遍历的贪心算法(耗时:60ms,内存:14.3M)
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
dp=nums
for indx in range(1,len(nums)):
dp[indx]=max(dp[indx-1]+nums[indx],nums[indx])
return max(dp)
注意:
1.动态规划关键是要确定状态转移方程:
dp[indx]=max(dp[indx-1]+nums[indx],nums[indx])
其中,状态是:子数组的和;最简单的状态是:dp[0]=nums[0]。