int a[] = { 10, 23, 4, 3, 4, 3, 2, 46, -47, 5, 5 };
上述数组可看做是一支几天连续的股票价格。
我们要做的是用最小的时间复杂度来求出最大化收益
public static int Max(int a[]) {
int result = 0;
for (int i = 0; i < a.length; i++) {
for (int j = i; j < a.length; j++) {
int temp = a[j] - a[i];
if (result < temp) {
result = temp;
}
}
}
return result;
}
暴力求解方式 :
可以用一天可其它之后的天数做运算,然后比较出最大值即可
如上面代码 。时间复杂度是n方
因为我们的目标是寻找一段日期,使第一天到最后一天的股票价格净变值最大,因此我们不再从每日价格去看待输入数据,而是考察每日价格变化。
[13, -19, -1, 1, -1, -1, 44, -93, 52, 0]
我们的任务是查找A数组中的最大子数组(所加之和最大的顺序连续数组)
只需要连续的进行加操作,便可以获得所有的两个数组之间的和,进行比较即可。
我们需要找到的是两边界值差最大的数组。所以当连加的呈增长趋势且两边界差为正数即可
当边界值的差为负数就可以开始进行新一轮的累加计算了。这样可以求出所有的可以获得收益的股票交易点。然后进行比较即可。
public static int Max2(int a[]) {
int i;
int MaxSum = 0;
int CurSum = 0;
for (i = 0; i < a.length; i++) {
CurSum += a[i];
if (CurSum > MaxSum)
MaxSum = CurSum;
if (CurSum < 0)
CurSum = 0;
}
return MaxSum;
}
时间复杂度为n