原题链接如下:
121. 买卖股票的最佳时机
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例 1:
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
提示:
1 <= prices.length <= 105
0 <= prices[i] <= 104
题解1(暴力法):
一言不合先上暴力哈哈哈,c++的运行速度要比python好点,没准暴力就过了呢?
观察题目,无非是找到两个元素之间差的最大值,同时更大的那个数字(也即卖出股票)的下标必须大于小的那个数字
也即,对于每个子数组,我们就是要求**max{prices[i]-prices[j]},其中i>j。
好吧,尝试了一下…代码都写完了,提交了,发现过不去,超时了,寄
题解2(假设法,动态规划思想):
好吧我也不知道该给这个方法取啥名字了,就是一种动态规划的思想(冠以假设的外壳),把题目中情景当成真实的买股票的实际场景,假设每天都是当天要卖出股票,而买入股票的时间,按照人的心理,总是会希望自己在以前知道价格的那些天数中的最低的价格的那一天买入,这样自己到时候肯定赚得就多。于是问题就成了随着时间推移,股票历史价格数据的越来越多,我们在当中寻找历史最低价格,同时假设当天卖出,得到一个利润,我们将每次得到的利润也是两两比较,从而得到最大利润。
class Solution {
public:
int maxProfit(vector<int>& prices) {
//首先设置一个历史最低股票价格和最大利润的两个变量
int minPrice=1e6;//先初始化一个比所有价格都会更高的最小值,便于其正确更新
int maxProfit = 1e-6;//先将其初始化为一个不可能的值
for(int price:prices){
minPrice = min(minPrice,price);
maxProfit = max(maxProfit,price-minPrice);
}
return maxProfit;
}
};
执行用时:96 ms, 在所有 C++ 提交中击败了80.96%的用户
内存消耗:91.2 MB, 在所有 C++ 提交中击败了43.78%的用户
通过测试用例:211 / 211