1. 程式人生 > >【leetcode】【53】Maximum Subarray

【leetcode】【53】Maximum Subarray

一、問題描述

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray [4,−1,2,1] has the largest sum = 6.

More practice:

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

二、問題分析

最大最長連續子序列,非常經典的dynamic programing問題。需要明確的是狀態轉移方程中的狀態代表的含義。因為contiguous,所以dp[i]代表的應該以i位置元素結尾的連續值,並非最大值。

三、Java AC程式碼

public int maxSubArray(int[] nums) {
        int[] dp = new int[nums.length];
		int max = nums[0];
		dp[0] = nums[0];
		for(int i=1;i<nums.length;i++){
			if (dp[i-1]<0) {
				dp[i] = nums[i];
			}else {
				dp[i] = dp[i-1]+nums[i];
			}
			max = Math.max(max, dp[i]);
		}
		return max;
    }
因為很多中間狀態是沒用的,因此可以用變數代表狀態,因此還可以優化。
public int maxSubArray(int[] nums) {
        int maxSoFar = Integer.MIN_VALUE;
		int maxEndingHere = 0;
		for(int i=0;i<nums.length;i++) {
			if (maxEndingHere<0) {
				maxEndingHere = 0;
			}
			maxEndingHere += nums[i];
			maxSoFar = Math.max(maxSoFar, maxEndingHere);
		}
		return maxSoFar;
    }