Leetcode 贪心算法 53. 最大子数组和

  1. 最⼤⼦序和
    题⽬地址: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有点慢啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值