Leetcode 121. Best Time to Buy and Sell Stock 最佳股票售卖时(动态规划,数组,模拟)
2018-02-07 16:19
471 查看
题目描述
已知一个数组,第i个元素表示第i天股票的价格,你只能进行一次交易(买卖各一次),设计算法找出最大收益测试样例
Input: [7, 1, 5, 3, 6, 4] Output: 5 最大收益 = 6-1 = 5 (不是7-1 = 6,因为先买后卖,7买,1买亏了6) Input: [7, 6, 4, 3, 1] Output: 0 最大收益为0
详细分析
初看非常简单,遍历数组,每次选择一个元素,找到这个元素后面的数组的最大值,计算差值,和当前最大收益比较即可,就像这样:[7,1,5,3,6,4] 当前7,后面最大6,收益-1
[7,1,5,3,6,4] 当前1,后面最大6,收益5
[7,1,5,3,6,4] 当前5,后面最大6,收益1
如此继续找到即可。
不过这种方法会超时,稍微改变一下,现在不止保持最大收益,还保存最低价格,如果当天价格更低,就刷新最小价格(买),同时如果当天价格减去最小价格的收益最大,就刷新最大价格(卖),过程如下:
[7,1,5,3,6,4]
minPrice=INT_MAX,maxProfit=0=>
minPrice=7,maxProfit=0
[7,1,5,3,6,4]
minPrice=7,maxProfit=0=>
minPrice=1,maxProfit=0
[7,1,5,3,6,4]
minPrice=1,maxProfit=0=>
minPrice=1,maxProfit=4
[7,1,5,3,6,4]
minPrice=1,maxProfit=4=>
minPrice=1,maxProfit=4
[7,1,5,3,6,4]
minPrice=1,maxProfit=4=>
minPrice=1,maxProfit=5
[7,1,5,3,6,4]
minPrice=1,maxProfit=5=>
minPrice=1,maxProfit=5
算法实现
方法1:Time Limit Exceededclass Solution { public: int maxProfit(vector<int>& prices) { int profit = 0; for(auto start=prices.begin();start!=prices.end();start++){ int buy = *start; int sell = *std::max_element(start,prices.end()); if((sell - buy)>profit){ profit = sell-buy; } } return profit; } };
方法2: Accepted
class Solution{ public: int maxProfit(vector<int> &prices){ int profit = 0; int minBuy = std::numeric_limits<int>::max(); for(int i=0;i<prices.size();i++){ //buy it if current price is less than minimum prices yet if(prices[i]<minBuy){ minBuy = prices[i]; } //sell it if current profit got optimally if((prices[i]-minBuy)>profit){ profit = prices[i]-minBuy; } } return profit; } };
相关文章推荐
- Leetcode 121. Best Time to Buy and Sell Stock 最佳股票售卖时(动态规划,数组,模拟)
- leetcode 121.Best Time to Buy and Sell Stock 股票买卖最佳时间
- LeetCode 121 Best Time to Buy and Sell Stock(股票买入卖出的最佳时间)
- [LeetCode] 121. Best Time to Buy and Sell Stock 买卖股票的最佳时间
- LeetCode-121-Best Time to Buy and Sell Stock(最佳买卖股票的时间)
- 【LeetCode-面试算法经典-Java实现】【121-Best Time to Buy and Sell Stock(最佳买卖股票的时间)】
- Leetcode121 Best Time to Buy and Sell Stock(买卖股票的最佳时机1)
- LeetCode WIith JS || 121. Best Time to Buy and Sell Stock[求股票的最佳收益,只能交易一次]
- 【LeetCode-面试算法经典-Java实现】【121-Best Time to Buy and Sell Stock(最佳买卖股票的时间)】
- [LeetCode 121] - 买入与卖出股票的最佳时机(Best Time to Buy and Sell Stock)
- LeetCode题库解答与分析——#121. 买卖股票的最佳时机BestTimeToBuyAndSellStock
- [LeetCode 123] - 买入与卖出股票的最佳时机III(Best Time to Buy and Sell Stock III)
- 最佳时间买入卖出股票 Best Time to Buy and Sell Stock LeetCode
- [LeetCode] Best Time to Buy and Sell Stock IV 买卖股票的最佳时间之四
- 动态规划入门级教学(leetcode)121.Best Time to Buy and Sell Stock
- [LeetCode 121]Best Time to Buy and Sell Stock(动态规划)
- LeetCode 121. Best Time to Buy and Sell Stock (买卖股票的最好时机)
- LeetCode 122 Best Time to Buy and Sell Stock II(股票买入卖出的最佳时间 II)
- Best Time to Buy and Sell Stock II 最佳时间买入卖出股票(多次买卖)@LeetCode
- [leetcode 121] Best Time to Buy and Sell Stock---只能买卖股票一次的最大收益