【题目描述】
AcWing 55. 连续子数组的最大和
【思路】
暴力做法
for(i 从0到n-1)
先前缀和统计
for(i从0到n - 1 )
for(j从0到n - 1){
根据前缀和计算[i,j]区间和sum
if(sun > ans) ans =sum
}
O(n ^ 2)
dp做法
class Solution {
public int maxSubArray(int[] a) {
if( a.length == 0 ) return 0;
int n = a.length;
int f[] = new int[n];
f[0] = a[0];
for(int i = 1; i < n; i ++)
{
f[i] = Math.max(f[i - 1] + a[i], a[i]);
}
int ans = f[0];
for(int i = 1; i < n; i ++)
if( f[i] > ans) ans = f[i];
return ans;
}
}
实际上,可以不用开辟数组空间。
class Solution {
public int maxSubArray(int[] f) {
int n = f.length;
for(int i = 1; i < n; i ++)
f[i] = Math.max(f[i - 1] + f[i], f[i]);
int ans = f[0];
for(int i = 1; i < n; i ++)
if( f[i] > ans) ans = f[i];
return ans;
}
}