总结的部分题目思路与代码,待完善。
【剑指offer-第二版】部分题目与解答【C++版本】
题目:
股票的最大利润
假设把某股票的价格按照时间先后顺序储存在数组中,请问买卖该股票一次可能获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14}。如果我们能在价格为5的时候买入并在价格为16的时候卖出,则能收获最大的利润11。
解题思路:
1.可以转换成为求最大子数组问题,数组相邻的数后一个减去前一个减得到股票的变化数组{2,-3,-3,2,5,4,-2}。这样问题转换成了求数组的最大子数组问题。
2.也可以在遍历数组时记录下遍历到某个节点能够买入的最低价格,在当前价格确定的情况下,在最低价格买入能够赚最多。这样遍历一次数组就能得到结果,时间复杂度为O(n)。
【C++版本】
#include <iostream>
#include <vector>
using namespace std;
int main() {
system("pause");
return 0;
}
//
int MaxDiff(const int *numbers, unsigned length) {
if (numbers == NULL || length < 2)return 0;
int min = numbers[0];
int resu = numbers[1] - min;
for (int i = 2; i != length; i++) {
//检查前一天的值是不是最小值,是就更新最小值
if (numbers[i-1] < min) {
min = numbers[i-1];
}
//当前时间卖出能赚到最多的钱吗
if ((numbers[i] - min) > resu) {
resu = numbers[i] - min;
}
}
return resu;
}