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];
- }
- };