- 题目描述
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
-
算法是这样子,比如序列是 1,2,-3, -3, 3
1、定义一个数字,用来保存每次累加的和sum, 再定义个数字,用来保存得到的最大的和result
2、先将数组的第一个元素(也就是1)赋值给 sum和result
2、从第二个开始遍历,每次遍历的时候看sum是否为负数,这里的思想就是说前边的数累加的和对当前的这个数”有没有帮助”,如果有的话,就把当前这个数字加到sum里,如果sum为负数的话, 说明前边的数已经加成一个负数了,应该舍弃掉,重新开始了,那么就把sum设置为当前的这个数字。最后是每次更改完sum之后要看之后的sum是不是大于result,是的话就result换成最新的sum,这个样子可以保证result一直是最大的。
1、第一次遍历的时候 sum 为 1, result 为 1, sum >= 0 ,把 2 加到 sum 里, sum 为 3, result为1 ,sum > result, 把result的值设置为sum的值, 3.
2、第二次遍历的时候 sum 为 3, result 为 3, sum >= 0 ,把 -3 加到 sum 里, sum 为 0, result为3 ,sum < result,不做替换
3、第三次遍历的时候 sum 为 0, result 为 3, sum >= 0 ,把 -3 加到 sum 里, sum 为 -3, result为3 ,sum < result,不做替换
4、第四次遍历的时候 sum 为 -3, result 为 3, sum < 0 ,sum替换为3. result为3 ,sum < result,不做替换
所以结果为3 -
代码
class Solution { public int maxSubArray(int[] nums) { if(null==nums || nums.length == 0 ){ return 0; } if(nums.length == 1){ return nums[0]; } int reuslt = nums[0]; int sum = nums[0]; for(int i = 1; i < nums.length; i++){ if(sum > 0){ sum += nums[i]; }else{ sum = nums[i]; } reuslt = reuslt > sum ? reuslt : sum; } return reuslt; } }