给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。 示例 2: 输入:nums = [1] 输出:1 示例 3: 输入:nums = [0] 输出:0 示例 4: 输入:nums = [-1] 输出:-1 示例 5: 输入:nums = [-100000] 输出:-100000 提示: 1 <= nums.length <= 3 * 104 -105 <= nums[i] <= 105 进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-subarray 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution: def maxSubArray(self, a) : if len(a)==1: return a[0] result =sum(a) max_a = max(a) max_index =a.index(max_a) result1,result2=[],[] if max_index !=0: for i in range(0,max_index+1): max_li = a[i:max_index+1] if sum(max_li) >result and len(max_li)!=0: result1 = max_li result = sum(result1) if max_index !=len(a)-1: for j in range(max_index+1,len(a)): max_li = a[max_index:j] if sum(max_li)>result and len(max_li)!=0: result2 =max_li result = sum(result2) if result1 and result2: result1.extend(result2[1:]) return result
但是,还是有问题,自己后来看了看正确答案,对比了一下:
class Solution: def maxSubArray(self, nums: List[int]) -> int: # 定义dp[i]为前i个数里面的最大子序和 # 举个例子: # nums: [-2, 1, 2] max = 1+2 = 3,最大子序和肉眼可见地为3 # dp[0]:[-2, 0, 0] dp[0] = -2 初始化 # 面临抉择:要不要把前面的最优算进来?如果算进来,就是dp[i-1]+nums[i], 如果不算,就是nums[i] # dp[1]:[-2, 1, 0] max(1, -2+1) = max(1, dp[0]+1) = 1 # dp[2]:[-2, 1, 3] max(2, dp[1]+2) = 3 # 所以dp[i] = max(num[i], d[i-1]+num[i]) # return max(dp)就好 n = len(nums) dp = [0]*n dp[0] = nums[0] for i in range(1,n): dp[i] = max(nums[i], dp[i-1]+nums[i]) return max(dp) 作者:yun6688 链接:https://leetcode-cn.com/problems/maximum-subarray/solution/pythonjie-fa-zui-da-zi-xu-he-by-yun6688-r4h1/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
本文作者:Eric
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!