Best Time to Buy and Sell Stock
Say you have an array for which the ith element is the price of a given stock on day i.
If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.
题目链接:https://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock/
给一个数prices[],prices[i]代表股票在第i天的售价,求出只做一次交易(一次买入和卖出)能得到的最大收益。
只需要找出最大的差值即可,即 max(prices[j] – prices[i]) ,i < j。一次遍历即可,在遍历的时间用遍历low记录 prices[o....i] 中的最小值,就是当前为止的最低售价,时间复杂度为 O(n)。
class Solution { public: int maxProfit(vector<int>& prices) { if(prices.size()==0||prices.size()==1) return 0; int low=prices[0]; int money=0; for(int i=1;i<prices.size();i++) { if(low>prices[i]) { low=prices[i]; } else if(money<prices[i]-low) money=prices[i]-low; } return money; } };
<h3 style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: rgb(51, 51, 51); margin-top: 20px; margin-bottom: 10px; font-size: 24px; display: inline;">Best Time to Buy and Sell Stock II</h3><span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"> </span>
<span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px;"></span><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 10px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 30px;">Say you have an array for which the <span style="box-sizing: border-box;">i</span><span style="box-sizing: border-box; position: relative; font-size: 12px; line-height: 0; vertical-align: baseline; top: -0.5em;">th</span> element is the price of a given stock on day <span style="box-sizing: border-box;">i</span>.</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 10px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 30px;">Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times). However, you may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).</p>
此题和上面一题的不同之处在于不限制交易次数。也是一次遍历即可,只要可以赚就做交易。题目链接:https://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/
此题和上面一题的不同之处在于不限制交易次数。也是一次遍历即可,只要可以赚就做交易。
class Solution { public: int maxProfit(vector<int> &prices) { int n=prices.size(),max=0; for (int i=1;i<n;i++) { if (prices[i]>prices[i-1]) { max+=prices[i]-prices[i-1]; } } return max; } };
Best Time to Buy and Sell Stock III
Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete at most two transactions.
Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
题意:获取股票最大收益,最多可交易两次,且必须完成一桩交易之后才能进行另一桩交易。当然,可以第i天卖出后又当天买回。
因为最多两次交易,很容易联想到将数组分为两部分,对两部分数组分别求最大值,然后将两个最大值相加,经多次比较,得到总的最大值。但是这会出现一个问题,时间复杂度太大。经测试,这种方式会导致Time Limited Exceed的错误。
那么现在需要考虑一下有没有可以改进的方法,答案是有的,可以利用一维的动态规划来做,因为我们可以观察到,之前的方案之所以复杂度太大是因为有很多重复的计算。而动态规划可以采取的方式是:
1)新开一个数组maxProfitWith,这个数组用来保存第i天可以获得的最大收益。
2)将prices数组都遍历一遍之后,可以知道最后一项,即maxProfitWith[size-1]即为遍历一遍时的最大收益。
3)我们再逆序遍历一遍,计算当前i到最后一天的最大收益,与之前的0至第i天的最大收益相加,可以得到总的最大收益finalProfit,比较之后,可以得到最终结果。
class Solution { public: int maxProfit(vector<int> &prices) { if (prices.size()<=1) { return 0; } vector<int>max_profit_list; max_profit_list.push_back(0); int lowest=prices[0]; int maxprofit=0; for (int i=1;i<prices.size();i++) { if (prices[i]-lowest>maxprofit) { maxprofit=prices[i]-lowest; } max_profit_list.push_back(maxprofit); if (prices[i]<lowest) { lowest=prices[i]; } } int ret=max_profit_list[prices.size()-1]; int highest=prices[prices.size()-1]; maxprofit=0; for (int i=prices.size()-2;i>=0;i--) { if (highest-prices[i]>maxprofit) { maxprofit=highest-prices[i]; } int total_profit=maxprofit+max_profit_list[i]; if (ret<total_profit) { ret=total_profit; } if (prices[i]>highest) { highest=prices[i]; } } return ret; } };