描述

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例

输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

Tag

array | divide-and-conquer | dynamic-programming

思路

代码

方法一:暴力求解O(n3)

  1. public int maxSubArray(int[] nums) {
  2. int maxSum =0;
  3. for (int i = 0; i < nums.length; i++) {
  4. for (int j = i; j < nums.length; j++) {
  5. int tempSum=0;
  6. for (int k = i; k <= j; k++) {
  7. tempSum += nums[k];
  8. }
  9. if (tempSum > maxSum) {
  10. maxSum=tempSum;
  11. }
  12. }
  13. }
  14. return maxSum;
  15. }

方法二:暴力求解改进版O(n2)

  1. public int maxSubArray1(int[] nums) {
  2. int maxSum=0;
  3. for (int i = 0; i < nums.length; i++) {
  4. int tempSum=0;
  5. for (int j = i; j < nums.length; j++) {
  6. tempSum += nums[j];
  7. if (tempSum > maxSum) {
  8. maxSum=tempSum;
  9. }
  10. }
  11. }
  12. return maxSum;
  13. }

方法三:O(n)

  1. public int maxSubArray2(int[] nums) {
  2. int maxSum=0;
  3. int tempSum=0;
  4. for (int i = 0; i < nums.length; i++) {
  5. tempSum+=nums[i];
  6. if (tempSum > maxSum) {
  7. maxSum=tempSum;
  8. } else if (tempSum < 0) {
  9. tempSum=nums[i];
  10. }
  11. }
  12. return maxSum;
  13. }

方法四:leetCode题解

  1. public int maxSubArray4(int[] nums) {
  2. int max = Integer.MIN_VALUE,sum=0;
  3. for (int i = 0; i < nums.length; i++) {
  4. if (sum<0)
  5. sum=nums[i];
  6. else
  7. sum+=nums[i];
  8. if (sum>max)
  9. max=sum;
  10. }
  11. return max;
  12. }