「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」
题目描述
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
示例 1:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
思路分析
题目给定股票每一天的价格,我们要想从中获得最大利润,只需在股票最低价时买入在最高价时卖出。令人难以琢磨的是我们只知道当天的价格,难以推断出何时买入、何时卖出。
这里也许你会想到暴力破解的方式,两遍for循环计算每个值和它后面值得大小,再用一个max变量保存值,并不断与后面的值比较并更新。这样的思路显然是可行的,但这样也使咋们的时间复杂度来到了n方,显然这不是面试官所希望看到的结果。
我们何不换种思路,使用动态规划的思想,求出每天的最大利润并保存。这里每天的利润计算等于当天的股价减去历史最低价(即在这个数字之前的最小值),然后再跟之前的最大利润作比较,如果大于则放入新值,反之继续保存历史最大利润。更新利润后,再更新历史最低价。
代码展示
class Solution {
public:
int maxProfit(vector<int>& prices) {
int length=prices.size();
if(length==0) return 0;
int profit[length];
int minPrice;
profit[0]=0;
minPrice=prices[0];
for(int i=1;i<=(length-1);i++){
profit[i]=max(profit[i-1],prices[i]-minPrice);
minPrice=min(minPrice,prices[i]);
}
return profit[length-1];
}
};
复杂度分析
- 时间复杂度:O(n)O(n),只需要遍历一次。
- 空间复杂度:O(1)O(1),只使用了常数个变量。
题目原链接: 剑指 Offer 63. 股票的最大利润