给你一个整数数组 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提示:
1 <= nums.length <= 1 0 5 10^5 105
- 1 0 4 10^4 104 <= nums[i] <= 1 0 4 10^4 104
思路看leetcode官方视频讲解:
class Solution:def maxSubArray(self, nums: list) -> int:#贪心解法: 如果当前元素之前的和小于0,那么就应该丢弃,否则加上当前元素maxsum, presum = -10000, -10000if len(nums) == 1:return nums[0]for i in nums:if presum < 0:presum = ielse:presum += imaxsum = max(maxsum, presum)return maxsumdef maxSubArray(self, nums: list) -> int:#动态规划:如果前一个元素大于0,把它加到当前元素上if len(nums) == 1:return nums[0]maxsum = nums[0]for i in range(1,len(nums)):nums[i] = max(nums[i], nums[i] + nums[i-1])maxsum = max(nums[i], maxsum)return maxsum
贪心解法在这道题上比较容易理解,但也有一个点就是需要设着两个变量:一个记录最大值,一个记录当前的和。想一下,前面一个连续数组的和很大,但是遇到了一个更大的负数,导致和小于等于0,当重新开始计数后,后边的数组和不一定比前面的大,所以需要两个变量