对求最长字数组之和的理解

首先是对题目的描述:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 :
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray

上题目解

   if(nums.length == 0)return 0;
   int res = nums[0];
   int sum = 0;
   for (int num:nums){
       if (sum>0){
           sum += num;
       }else {
           sum = num;
       }
       res = Math.max(res,sum);
   }
   return res;

对于这道题,我首先的想法就是暴力解法,遍历全部子数组,然后比较大小,但是在实现过程中,我有了其他思路。
对于每次的加法运算过程中,需要最大的值,只有一种就是正数相加的情况,那么对于这种情况的拓展思路就是最差的情况下,只有中间的负数相加并且比最后一个正数的绝对值大小小的情况下才可能发生。同时我们需要有一个记录的机制,用来保存那些正数的单个子数组的值。
思考到这,我就开始实现算法,但是再次思考发现,对于后面的这个正数又不是这样的情况,对于后面的这个正数来说,即使是前面的这些负数数加起来是比这个正数的绝对值小,那么前几个数之和也有可能是个负数,也就是说对于这个正数来说是变小了的情况,还不如这个正数本身的子数组来得大。
按照这个思路,我再次修改,就是说,我们对于每次的数组进行累加,要是累加了的数是小于0的就放弃之前的数的累加。然后往下走,同时这个对于0的判断也可以用作对于正负数的判断,我们是需要找到正数来进行累加的。

总结一下,我们需要:
一个对于正数的记录,也就是最大值的记录:
int res = nums[0];
res = Math.max(res,sum);:更新操作,每次的最大值只能在上一次的最大值以及这一次的累加中产生。
int sum = 0;累加数
遍历数组,记录上一次的sum之后进行判断,上一次累加过后,sum小于0就是说放弃之前的累加,然后读取这一次的num值对sum进行更新
if (sum>0){
sum += num;
}else {
sum = num;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值