同学面试RR公司时遇到的一道有意思的面试题:一个数组,找出和最大的两个连续数组,时间复杂度要最小。这道题我一看到就会想到用动态规划的想法,保存两个数组,一个是从左往右包含该点的最大的连续子数组的和,另一个是保存从右到左包含该点的最大的连续子数组的和,但是这样时间复杂度为0(n2),时间复杂度太高了。我们改变这两个数组保存的信息,一个保存的是该点以前的最大的连续字数组的和,同理另一个数组也是这样。这样遍历一遍就可以得到结果,时间复杂度为0(n),上代码:
int maxContinueArray(int A[], int n)
{
vector<int> f(n);
vector<int> g(n);
f[0] = A[0];
for (int i = 1; i < n; i++)
{
f[i] = max(A[i], f[i - 1] + A[i]);
}
g[n - 1] = A[n - 1];
for (int i = n - 2; i >= 0; i--)
{
g[i] = max(A[i], g[i + 1] + A[i]);
}
int tmp = f[0];
for (int i = 1; i < n; i++)
{
f[i] = max(f[i], tmp);
tmp = f[i];
}
tmp = g[n - 1];
for (int i = n - 2; i >= 0; i--)
{
g[i] = max(g[i], tmp);
tmp = g[i];
}
tmp = INT_MIN;
for (int i = 0; i < n - 1; i++)
{
tmp = max(tmp, f[i] + g[i + 1]);
}
return tmp;
}