[LeetCode] 53.最大子数组和(Maximum Subarray)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huanghaocs/article/details/81056675

1.问题描述

给定一个连续的整数数组,正负值都可能出现,求该数组中和最大的连续子数组。
如A = [-2,1,-3,4,-1,2,1,-5,4],有很多的连续子数组,和最大的连续子数组是a = [4,-1,2,1],其中和sum=6。

2.解决方法

使用动态规划方法,先解决子数组的最大值,然后在考虑整个数组的最大值,状态转移方程为
DP[i] = Max{DP[i-1]+A[i], A[i]}, DP[i]表示数组长度为i+1时的最大子数组和,A[i]表示数组中第i+1个元素。步骤如下:
(1) 先记第一个元素为最大值,之后每次循环增加一个元素;
(2) maxSum记录最大和,subSum记录子序列的和;
(3) 增加元素为nums[i],比较 subSum+nums[i] 和 nums[i] 看增加的元素是否使子序列和变大;
(4) 最后比较maxSum和subSum选出最大值。

3.代码实现

  public class solution{
      public int maxSubArray(int[] nums) {
          if(nums == null || nums.length == 0)
              return 0;
          int maxSum = nums[0]; //存储最大值
          int subSum = nums[0]; //存储子序列的和
          for(int i=1; i<nums.length; i++){
              if(nums[i] > subSum+nums[i]) 
                  subSum = nums[i];
              else 
                  subSum = subSum+nums[i];
              if(subSum > maxSum)
                  maxSum = subSum;
          }
          return maxSum;
      }
      public static void main(String[] args) {
            int[] nums = {-2,1,-3,4,-1,2,1,-5,4};
            System.out.println(maxSubArray(nums));
      }
 }

猜你喜欢

转载自blog.csdn.net/huanghaocs/article/details/81056675