最大子序和

此博客链接: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;

    }
}

这道题做完真开心,以前上课讲过,但是不知道为啥,而且现在一点印象没有,这次是自己想出来,并且想明白的,哈哈。

 

posted @ 2020-09-26 09:52  萍2樱释  阅读(147)  评论(1编辑  收藏  举报