zoukankan      html  css  js  c++  java
  • Leetcode: Best Time to Buy and Sell Stock I, II

    思路:

    1. 算法导论讲 divide and conquer 时, 讲到过这个例子. 书中的做法是先让 price 数组减去一个值, 然后求解最大连续子数组的和. 分治算法的复杂度为 o(nlogn)

    2. 剑指 offer 来给出最大连续子数组和的动态规划做法, 时间复杂度缩小到 o(n)

    3. 此题不必转化为最大连续子数组和问题, 可以直接使用动态规划解法(我不知道如何转化).  假设 dp[i] 表示第 i 天把股票卖出获得的最大收益, 那么可以根据 price[i] 和 price[i-1] 之间的关系可以推出 dp[i] 与 dp[i-1] 的关系

    if(prices[i] > prices[i-1]) // 股票价值升高, 卖出获得的 profit 必然增大
        dp[i] = dp[i-1] + prices[i]-prices[i-1];
    else { // 股票价格下降, 此时卖出, 有可能亏本. 亏本的话, 就选择第 i 天买, 同日卖, 收益是0
         dp[i] = max(0, dp[i-1]+prices[i]-prices[i-1]);
    }
    

      

    总结:

    1. 考虑动规解法时, dp 有两种设置方法, 第一中设置方法是 dp[i] 表示前 i 个的最优解, 这是一种全局的设置方法, 最终返回 dp[n]. 第二种是 dp[i] 表示第 i 个的最优解, 这是一种局部的设置方法, 最终返回 optimal(dp[1], dp[2], ...)

    2. 代码本来设置了一个数组 dp[20000] 但仍是 runtime error. 后来改成 curDif 和 maxDif 才过

    代码:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    class Solution {
    public:
    	
        int maxProfit(vector<int> &prices) {
    		int maxDif = 0;
    		int curDif = 0;
    
    		for(int i = 1; i < prices.size(); i ++) {
    			curDif = max(0, curDif + prices[i]-prices[i-1]);
    			maxDif = max(curDif, maxDif);
    		}
    		return maxDif;
        }
    };
    

    II

    思路:

    简单模拟, 自动机

    #include <iostream>
    #include <vector>
    using namespace std;
    class Solution {
    public:
        int maxProfit(vector<int> &prices) {
           int profit = 0;
    	   for(int i = 0; i < prices.size(); i ++) {
    		   int initPrice = prices[i];
    		   i++;
    		   while((i) < prices.size() && prices[i] >= prices[i-1] )
    			   i++;
    		   i--;
    		   profit += prices[i]-initPrice;
    	   }
    	   return profit;
        }
    };
    

     

  • 相关阅读:
    Html笔记(四)图像
    Html笔记(三)列表
    Html笔记(二)字体
    Html笔记(一)概述
    mysql基础~经典题目
    MGR架构~原理细节分析(8.0最新版)
    hiveserver2
    恋爱心理
    和谐之道
    智者遇事求心,庸者遇事求境
  • 原文地址:https://www.cnblogs.com/xinsheng/p/3449179.html
Copyright © 2011-2022 走看看