最大子序和
此博客链接:https://www.cnblogs.com/ping2yingshi/p/13733903.html
最大子序和(44min)
题目链接:https://leetcode-cn.com/problems/maximum-subarray/、
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
题解:
思路:抽象成数学模型,每个数当前位置的和记为Sum(n),Sum(n)是有前面一个数的和加上当前的数字,即Sum(n)=Sum(n-1)+an;但是这里有一个问题是,求连续子序列和时,如果前面都是负数,只有当前数字是整数,那肯定前面负数的值要去掉。像例题一样,求连续子序列和时,前三个数就去掉了。这里我想到判断前面几个数的子序列和时,如果前面的和是小于0的,那么就把前面的和置为当前值,相当于没有要前面几个数的和。如果前面的和是大于0,但是当前值和前面和的和是小于0的,那么当前的和应该被置为0;
代码如下:
class Solution { public int maxSubArray(int[] nums) { int len=nums.length; if(len==1) { return nums[0]; } int [] sum=new int [len]; sum[0]=nums[0]; for(int i=1;i<len;i++) { if(sum[i-1]<0) { sum[i]=nums[i]; } else{ sum[i]=sum[i-1]+nums[i]; if(nums[0]<0&&sum[i]<0) sum[i]=0; } } int max=-10000; for(int j=0;j<len;j++) { if(max<sum[j]) { max=sum[j]; } } return max; } }
这道题做完真开心,以前上课讲过,但是不知道为啥,而且现在一点印象没有,这次是自己想出来,并且想明白的,哈哈。
出来混总是要还的