DAY51
121買賣股票的最佳時機
做過了。算是二刷:來自力扣優質題解
貪心:
每次記錄更新最小點和最大出售值。
- class?Solution?{
- public:
- ????int?maxProfit(vector<int>&?prices)?{
- ????????int?cur,res=INT_MIN,curmin=INT_MAX;
- ????????for(int?i=0;i<prices.size();i++){
- ????????????if(prices[i]<curmin)?curmin=prices[i];
- ????????????cur=prices[i]-curmin;
- ????????????if(cur>res)?res=cur;
- ????????}
- ????????return?res;
- ????}
- };
暴力:
- class?Solution?{
- public:
- ????int?maxProfit(vector<int>&?prices)?{
- ????????int?res=0;
- ????????for(int?i=0;i<prices.size();i++){
- ????????????for(int?j=i+1;j<prices.size();j++)
- ????????????res=max(res,prices[j]-prices[i]);
- ????????}
- ????????return?res;
- ????}
- };
動態規劃:
算是比較系統的東西,記在紙質筆記本吧。
- class?Solution?{
- public:
- ????int?maxProfit(vector<int>&?prices)?{
- ????????if(prices.size()==1)?return?0;
- ????????vector<vector<int>>?dp(prices.size(),vector<int>(2));
- ????????dp[0][0]=-1*prices[0];
- ????????dp[0][1]=0;
- ????????for(int?i=1;i<prices.size();i++){
- ????????????dp[i][0]=max(-prices[i],dp[i-1][0]);
- ????????????dp[i][1]=max(prices[i]+dp[i-1][0],dp[i-1][1]);
- ????????}
- ????????return?dp[prices.size()-1][1];
- ????}
- };
滾動數組法:
- class?Solution?{
- public:
- ????int?maxProfit(vector<int>&?prices)?{
- ????????if(prices.size()==1)?return?0;
- ????????vector<int>?dp(2);
- ????????dp[0]=-1*prices[0];
- ????????dp[1]=0;
- ????????for(int?i=1;i<prices.size();i++){
- ????????????dp[0]=max(-prices[i],dp[0]);
- ????????????dp[1]=max(prices[i]+dp[0],dp[1]);
- ????????}
- ????????return?dp[1];
- ????}
- };
時間竟然也快了很多,不知道為什么。
122買賣股票的最佳時機ii
做過貪心法:只要能賺錢就買賣。
- class?Solution?{
- public:
- ????int?maxProfit(vector<int>&?prices)?{
- ????????if(prices.size()==1)?return?0;
- ????????int?sum=0;
- ????????for(int?i=1;i<prices.size();i++){
- ????????????int?res=prices[i]-prices[i-1];
- ????????????if(res>0)?sum+=res;
- ????????}
- ????????return?sum;
- ????}
- };
動態規劃:
想對了,[多次買入和一次買入]和上一題不同的地方就是多了一個項:-price[i]不夠了,要寫成:dp[i-1][1]-price[i]
- class?Solution?{
- public:
- ????int?maxProfit(vector<int>&?prices)?{
- ????????if?(prices.size()?==?1)
- ????????????return?0;
- ????????vector<vector<int>>?dp(prices.size(),?vector<int>(2));
- ????????dp[0][0]?=?-1?*?prices[0];
- ????????dp[0][1]?=?0;
- ????????for?(int?i?=?1;?i?<?prices.size();?i++)?{
- ????????????dp[i][0]?=?max(dp[i?-?1][1]?-?prices[i],?dp[i?-?1][0]);
- ????????????dp[i][1]?=?max(dp[i?-?1][0]?+?prices[i],?dp[i?-?1][1]);
- ????????}
- ????????return?dp[prices.size()?-?1][1];
- ????}
- };
滾動數組:
- class?Solution?{
- public:
- ????int?maxProfit(vector<int>&?prices)?{
- ????????if?(prices.size()?==?1)
- ????????????return?0;
- ????????vector<int>?dp(2);
- ????????dp[0]?=?-1?*?prices[0];
- ????????dp[1]?=?0;
- ????????for?(int?i?=?1;?i?<?prices.size();?i++)?{
- ????????????dp[0]?=?max(dp[1]?-?prices[i],?dp[0]);
- ????????????dp[1]?=?max(dp[0]?+?prices[i],?dp[1]);
- ????????}
- ????????return?dp[1];
- ????}
- };