题目一:已知一个整型数组,表示某只股票在每天的价格(假定每天价格保持一定,并且可买入可卖出),如果只允许买入一次卖出一次, 问最佳受益是多少?
这题跟数组最大距离恰成互补,这题简化之后就是 已知A[n], 问找到 j > i, 使得A[j] - A[i] 最大。(数组最大距离是 找到 A[j] > A[i], 使得 j-i 最大)
要求A[j] - A[i] 最大,我们如果以j从0起始遍历,无非就是让A[j] 跟左边元素中的最小值Lmin相比,显然Lmin可以在j遍历过程中不断更新,所以这里的线性查找就呼之欲出了。
int bestbuysellstock01(const int *A, int n, int& buy, int& sell){
int min=0, maxDiff=0;
buy = sell = 0;
for(int i=1;i<n;++i){
if(A[i] < A[min]){
min = i;
}else{
int diff = A[i] - A[min];
if(diff > maxDiff){
maxDiff = diff;
buy = min;
sell = i;
}
}
}
return maxDiff;
}