背景题目:
给定一个整形数组,找到连续的和最大的子序列。
1. 暴力破解(O(n3)):
for i : 1 to n
for j : i to n
sum = 0
for k : i to j
sum += Array[k]
maxSum = max(maxSum, sum)
2. 优化(O(n2)):
创建一个同样大小的整形数组,原始数组为Array1,新建的数组为Array2,Array2[i]表示以Array1[i]为结尾的所有子串中的最大和。构建方式如下:
for i to 1
sum += Array1[i]
maxSum = max(sum, maxSum)
3. 辅助数组:
创建一个同样大小的整形数组,原始数组为Array1,新建的数组为Array2,Array2[i]表示以Array1[i]为结尾的所有子串中的最大和。构建方式如下:
for i : 1 to n
if(0 == i)
Array2[i] = max(0, Array1[i]);
else
if(Array2[i - 1] > 0)
Array2[i] = max(Array2[i - 1] + Array1[i], 0);
else
Array2[i] = max(Array1[i], 0);
原题:
假设我们想要查找的是总和最接近0的子向量,而不是具有最大总和的子向量,你能设计出的最优先的算法是什么?就可以应用到那些算法设计技术?如果我们希望查找总和最接近某一给定实数t的子向量,结果又将怎样?
解法(O(nLogn)):
创建数组Sum,Sum[i] = Array1[1] + Array[2] + ... Array[i],复杂度为O(n),此时计算子向量Array[i...j] = Sum[j] - Sum[i],要求的即为Sum中最接近的两个数;
对Sum排序,O(nLogn);
找到相邻的差值最小的,O(n)
类似的都可以考虑上述第三个算法和创建Sum数组的解题方法。