maximum subarray


Problem Description
这题有好多种AC的方法。这里我写了两种。
dp[i]表示从0~i之间最大的subarray, 用一个local的数组,来记录局部最优。
那么dp[i] = max{dp[i-1], local[i]}
其中local[i] = max{local[i - 1] + nums[i], nums[i]}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public int (int[] nums) {
if (nums == null || nums.length == 0)
return 0;

int[] dp = new int[nums.length];
int[] local = new int[nums.length];
dp[0] = nums[0];
local[0] = nums[0];
for (int i = 1; i < nums.length; ++i) {
local[i] = Math.max(local[i - 1] + nums[i], nums[i]);
dp[i] = Math.max(dp[i - 1], local[i]);
}
return dp[nums.length - 1];
}

感觉这种方法不能算DP,算贪心吧。用一个local数组,来记录,包含i的区间中最优的解。然后再用一个变量来记录最大的局部最优解,最后返回这个变量。

1
2
3
4
5
6
7
8
9
10
11
12
public int (int[] nums) {
if (nums == null || nums.length == 0)
return 0;
int[] local = new int[nums.length];
int ans = nums[0];
local[0] = nums[0];
for (int i = 1; i < nums.length; ++i) {
local[i] = Math.max(local[i - 1] + nums[i], nums[i]);
ans = Math.max(ans, local[i]);
}
return ans;
}