LeetCode53 最大子串

Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

Example:

Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
Follow up:

If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

package LeetCode;

public class MaximumSub {
   //常规的不断叠加
   public int maxSubArray(int[] nums) {
       int n = nums.length;
       int maxSum = Integer.MIN_VALUE;
       int currSum = 0;

       for (int i = 0; i < n; i++) {
           if (currSum > maxSum) {
               maxSum = nums[i];
           }
           currSum += nums[i];

           if (currSum > maxSum) {
               maxSum = currSum;
           }

           if (currSum < 0) {
               currSum = 0;
           }
       }
       return maxSum;
   }

   //用动态规划
   /**
    * 问题拆解: 问题的核心是子数组,子数组可以看作是一段区间,因此可以由起始点和终止点确定一个子数组,两个点中,我们先确定一个点,然后去找另一个点,
    * 比如说,如果我们确定一个子数组的截止元素在 i 这个位置,这个时候我们需要思考的问题是 “以 i 结尾的所有子数组中,和最大的是多少?”,
    * 然后我们去试着拆解,这里其实只有两种情况:
    *  i 这个位置的元素自成一个子数组
    *  i 位置的元素的值 + 以 i - 1 结尾的所有子数组中的子数组和最大的值
    * 你可以看到,我们把第 i 个问题拆成了第 i - 1 个问题,之间的联系也变得清晰
    * 状态定义 通过上面的分析,其实状态已经有了,dp[i] 就是 “以 i 结尾的所有子数组的最大值”
    * 递推方程 拆解问题的时候也提到了,有两种情况,即当前元素自成一个子数组,另外可以考虑前一个状态的答案,于是就有了
    * dp[i] = Math.max(dp[i - 1] + array[i], array[i])简化为:dp[i] = Math.max(dp[i - 1], 0) + array[i]
    */
   public int maxSumArr(int[] nums) {
       if (nums == null || nums.length == 0) return 0;
       int n = nums.length;
       int[] dp = new int[n];
       dp[0] = nums[0];
       int res = dp[0];
       for (int i = 1; i < n; i++) {
           dp[i] = Math.max(dp[i - 1], 0) + nums[i];
           res = Math.max(res, dp[i]);
       }
       return res;
   }

   public static void main(String[] args) {
       MaximumSub test = new MaximumSub();
       int[] arr = {-2,1,-3,4,-1,2,1,-5,4};
       int answer1 = test.maxSubArray(arr);
       int answer2 = test.maxSumArr(arr);
       System.out.println(answer1);
       System.out.println(answer2);

   }
}

你可能感兴趣的:(LeetCode53 最大子串)