题目:
给定一个数组 prices
,它的第 i
个元素 prices[i]
表示一支给定股票第 i
天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
。
思路:
想法一:
- 因为要考虑买入卖出中间差最大,且买入卖出有先后顺序,因此不能单纯以最大最小值作参考。
- 要对每一个数进行讨论,但这样会使时间复杂度出奇的大。
- 因此我们选用动态规划,动态规划 :前i天的最大收益 = max
- 在使用动态规划过程中,我一开始选择创建一个最小值的方法,对每次前i个数进行排序,找到最小值,后来感觉T很大,放弃后使用flag变量标记前i个数最小值的下标,每增加一个数就与最小值进行比较。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int max = 0;
int flag = 0;
for(int i = 1;i < prices.size();i++){
if(prices[i] < prices[flag]){
flag = i;
}
if((prices[i] - prices[flag]) > max){
max = (prices[i] - prices[flag]);
}
}
return max;
}
};
想法二:
而官方给出的代码是:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int inf = 1e9;
int minprice = inf, maxprofit = 0;
for (int price: prices) {
maxprofit = max(maxprofit, price - minprice);
minprice = min(price, minprice);
}
return maxprofit;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/solutions/136684/121-mai-mai-gu-piao-de-zui-jia-shi-ji-by-leetcode-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 其中1e9代表无穷。实际中遇到的一些问题,或者解决一些算法问题时,会遇到给某个变量初始化并赋值为1e9。接着后面会出现一些代码计算最小值。这时,1e9的作用是给变量赋一个初始极大值,原因在于后面的代码中需要取此变量和其他变量的最小值。初始化为一个最大值,亦即初始化为无穷,便于后面极小值的比较和获取,属于初始化的目的。
- 调用max函数可以直接计算二者最大值,min可以直接计算二者最小值。官方和我的思路差不多,不过实现形式简化了不少