C++实现LeetCode(121.买卖股票的最佳时间)
题目描述
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
注意:你不能在买入股票前卖出股票。
示例 1:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第2天(股票价格 = 1)的时候买入,在第5天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
解法
我们可以用贪心的思路来做这道题目。我们用一个变量 minprice
来记录前 i-1
天的最低价格,用变量 maxprofit
来记录当前最大利润。我们遍历 i
天时,与 minprice
做差,可以得到当天能够获得的最大利润,然后与前面获得的利润对比,只保留更大的那一个。
具体做法如下:
- 初始化
minprice
为一个非常大的数,因为价格只会大于 0 。 - 初始化
maxprofit
为 0。 - 遍历数组,对于每一天的价格进行分析。
- 计算当天价格与之前最低价格相差的利润
profit
。 - 如果
profit
大于当前最大利润maxprofit
,则跟新maxprofit
。 - 如果当天价格小于
minprice
,则更新minprice
。 - 最终返回
maxprofit
。
代码示例
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.empty()) return 0; // 数组为空,直接返回0
int minprice = prices[0];
int maxprofit = 0;
for(int i = 1; i < prices.size(); i++) {
int profit = prices[i] - minprice; // 获取当日的最大盈利
if(profit > maxprofit) maxprofit = profit; // 更新最大利润
if(prices[i] < minprice) minprice = prices[i]; // 更新最低价格
}
return maxprofit;
}
};
示例说明
示例 1
给定数组 [7,1,5,3,6,4],初始值为 minprice = 7
,maxprofit = 0
。
处理到第二个数 1
时,profit = 1 - minprice = -6
,小于0,不做任何操作,最低价格不变,最大利润也不变。
处理到第三个数 5
时,profit = 5 - minprice
,maxprofit 从0更新为5。
处理到第四个数 3
时,profit = 3 - minprice
,小于 5 ,不做任何操作。
处理到第五个数 6
时,profit = 6 - minprice
,比maxprofit要大,更新 maxprofit 为 6。
处理到第六个数 4
时,profit = 4 - minprice
,小于 6 ,不做任何操作。
最终,返回的最大利润为 5。
示例 2
给定数组 [7,6,4,3,1],初始值为 minprice = 7
,maxprofit = 0
。
处理到第二个数 6
时,profit = 6 - minprice = -1
,小于 0,不做任何操作。
处理到第三个数 4
时,profit = 4 - minprice = -3
,小于0,不做任何操作。
处理到第四个数 3
时,profit = 3 - minprice = -4
,小于0,不做任何操作。
处理到第五个数 1
时,profit = 1 - minprice = -6
,小于0,不做任何操作。
返回的最大利润为0。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现LeetCode(121.买卖股票的最佳时间) - Python技术站