力扣53. 最大子数组和

本文讨论了解题时从人的角度出发,理解问题后再结合编程实现的策略,如如何找到连续子序列的最大和,以及使用代码实现的Solution类中的maxSubArray方法。
摘要由CSDN通过智能技术生成

目录

做题感悟

题目描述

从人的角度出发的解题思路

代码实现思路(新手优先从这里看)


 

做题感悟

解题时可以先从人的角度出发看看这一问题该如何解决,然后再从计算机的角度出发结合编程语言的实现情况,看看是否可以暴力出来,然后可以再进一步化简

如果是思维题的化简讲究随机应变

dp二分等特定题型的化简便讲究套路了。

谢谢你听我一本正经的胡说八道

题目描述

从人的角度出发的解题思路

抛开计算机不谈,先说一下我们现实中碰到几个数让你求连续的几个数的和的最大值,怎么办,连续的序列比如 -2 1 -3  4 -1 2 1 -5 4   首先找连续序列的第一个数,只要是正常人,看到负数 -2 直接pass,只要是负数开头的序列一定会更小 ,然后直接 选1 接着就是-3 然后序列1开头也就到此为止了因为1+(-3)=-2 你如果把1+(-3)看成一个数-2  那么序列就变成了 -2 -2 4 -1 2 1 -5 4 所以我们要接着跳过-2(也就是1-3)

重新开始 选择连续序列得第一个数 4  然后 加上 -1 2 1 -5 4 然后发现在此期间最大 最大的连续子序列的和为6  {4 -1  2 1} 和{4 - 1 2 1 -5  4}

总之我们要一直保持我们当前的连续序列要大于0 ,因为如果序列小于0再加任意一个数n 那么结果均小于n ,所以当前序列小于0后我们就要舍弃这个序列了,在此期间我们要计算这个序列的最大值

代码实现思路(新手优先从这里看)

我们要创建一个变量 int sum=0;

sum记录着以nums[i]为首,nums[j]为结尾的子序列的和 i->[0,nums.length)  j->(i,nums) 

sum的转移方程:sum+=nums[i]

当sum<=0时我们就可以重新计算sum 

先让sum=0;

然后让nums[j+1]为子序列的第一个数  sum+=num[j+1]

然后就这样从头到尾遍历nums[]  并用max=Math.max(sum,max)一直计算子序列和的最大值

class Solution {
    public int maxSubArray(int[] nums) {
int sum=0;
int max=-1000000;
for (int i=0;i<nums.length;i++){
    sum+=nums[i];
    max=Math.max(max,sum);
    if (sum<=0)
    {
        sum=0;

    }


}
return max;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值