- 最⼤⼦序和
题⽬地址:https://leetcode-cn.com/problems/maximum-subarray/
给定⼀个整数数组 nums ,找到⼀个具有最⼤和的连续⼦数组(⼦数组最少包含⼀个元素),返回其最
⼤和。
示例:
输⼊: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续⼦数组 [4,-1,2,1] 的和最⼤,为 6
想法:暴力求解
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
max=-100000
for i in range(0,len(nums)):
sum=0
for j in range(0,len(nums)-i):
sum=sum+nums[i+j]
if sum>=max:
max=sum
return max
执行结果:
超出时间限制
这玩意跟乌龟的差别就是没长四条腿。而且python过不了,所以要更精妙的解法
想法2:递归
但是leetcode跑不了,pass
但总的来说,减少搜索范围是非常重要的一件事情,那么先写点东西看看:
1,2,-1,-3
其最大子数组为1,2
如果按照算法跑一下,输出结果会是这样:
1,3,2,-1
2,1,-2
-3,-4
似乎有点东西
-1,-2,-3的最大子数组为-1
搞一下的话就是:
-1,-3,-6
-2,-5
-3
所以如果j!=0的时候出现的还是负数,那么其最大子数组必不等于sum
强化升级一下:
def maxSubArray(self, nums: List[int]) -> int:
max=-100000
for i in range(0,len(nums)):
sum=0
for j in range(0,len(nums)-i):
sum=sum+nums[i+j]
if j!=0 and sum<0:
break
if sum>=max:
max=sum
return max
执行结果:
超出时间限制
还是不行
想法4:
要不换成c看看过得了吗?
不要
想法5:能不能把循环改一下:
否,如果按照这个找范围的情况很难改
想法6:参考了代码随想录Carl(不是广告,我真的参考了)
只需要改动一个小地方就行:
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
max=-100000
for i in range(0,len(nums)):
sum=0
for j in range(0,len(nums)-i):
sum=sum+nums[i+j]
if j!=0 and sum<0:
i=j
break
if sum>=max:
max=sum
return max
这里把搜索范围进一步缩小,当得到的j小于0时,可以直接令i=j+1处开始找最大子序列(这也是前面列举的时候忽略的地方)
那么经过修改,最终的代码变成了这样:
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
max=-100000
sum=0
for i in range(0,len(nums)):
sum=sum+nums[i]
if sum>max:
max=sum
if sum<=0:
sum=0
return max
其实可以不必每次从新开的点一直找所有的子序列,只要找每次定一个起点,一直往前加元素就好(经过列举这样同样可以取得最大子序列,之前的两层循环做了很多无用操作)
python有点慢啊