zoukankan      html  css  js  c++  java
  • 【LeetCode+51nod】股票低买高卖N题

    【121】Best Time to Buy and Sell Stock (2018年11月25日重新复习)

    给一个数组代表股票每天的价格,只能有一次交易,即一次买入一次卖出,求最大收益。

    题解:用一个变量维护此时的最大收益和最小成本。遍历数组求值。

     1 class Solution {
     2 public:
     3     int maxProfit(vector<int>& prices) {
     4         int minPrice = INT_MAX;
     5         int maxProfit = 0;
     6         for (auto ele : prices) {
     7             minPrice = min(ele, minPrice);
     8             maxProfit = max(maxProfit, (ele - minPrice));
     9         }
    10         return maxProfit;
    11     }
    12 };
    View Code

     2018年11月25日,这次一次 AC 了。

     1 class Solution {
     2 public:
     3     int maxProfit(vector<int>& prices) {
     4         const int n = prices.size();
     5         if (n < 2) {return 0;}
     6         int buy = prices[0], sell = 0;
     7         int ret = 0;
     8         for (int i = 1; i < n; ++i) {
     9             sell = prices[i];
    10             if (buy < sell) {
    11                 ret = max(sell - buy, ret);
    12             } else {
    13                 buy = prices[i];
    14             }
    15         }
    16         return ret;
    17     }
    18 };
    View Code

    【122】 Best Time to Buy and Sell Stock II (2018年11月25日复习)

    这题是给了一个数组代表股票每天的价格,可以做任意次的交易,但是不能同时持有多支股票。(每次的操作方式只能是先买,然后卖了,再买。不能在卖了之前再次买入。)

    题解:这题我是用了贪心,每次发现今天的价格比昨天的价格高,就在昨天买入,今天卖出。

     1 class Solution {
     2 public:
     3     int maxProfit(vector<int>& prices) {
     4         const int n = prices.size();
     5         int ret = 0;
     6         for (int i = 1; i < n; ++i) {
     7             if (prices[i] - prices[i-1] > 0) {
     8                 ret += prices[i] - prices[i-1];
     9             }
    10         }
    11         return ret;
    12     }
    13 };
    View Code

    还可以用dp解答,dp通用一些。以后那些变种都是dp的变种。

    【123】Best Time to Buy and Sell Stock III (2018年11月30日,复习)

    给了一个数组代表每天股票的价格,只能做两次交易,问最大的盈利是多少。(还跟原来的条件是一样的,不支持同时持有多股票,每次操作方式都是先买,卖了,然后才能再买。)

    题解:这题我用了类似动态规划这种做法,状态其实很简单,四个状态,分别代表第一次买入后的钱,第一次卖出后的钱,第二次买入后的钱,第二次卖出后的钱。最后这四个数可能都是负数,这个时候不买最好了。 

     1 class Solution {
     2 public:
     3     int maxProfit(vector<int>& prices) {
     4         const int n = prices.size();
     5         if (n == 0) {return 0;}
     6         vector<int> g(4, INT_MIN);
     7         g[0] = -prices[0];
     8         for (int i = 1; i < n; ++i) {
     9             g[0] = max(g[0], -prices[i]);
    10             g[1] = max(g[1], g[0]+prices[i]);
    11             g[2] = max(g[2], g[1]-prices[i]);
    12             g[3] = max(g[3], g[2]+prices[i]);
    13         }
    14         return max(0, max(g[1], g[3]));
    15     }
    16 };
    View Code

    【188】 Best Time to Buy and Sell Stock IV

    【309】 Best Time to Buy and Sell Stock with Cooldown

    【714】 Best Time to Buy and Sell Stock with Transaction Fee

  • 相关阅读:
    删除lv
    nohop以及后台运行的相关集合
    linux 上安装pstree
    python中的异常
    ansible批量验证密码
    Linux显示不了中文
    zabbix修改和查看登录密码
    chkconfig --add失败的处理方法
    vivado2016.2下系统自带DDR3 ip例程仿真运行
    分享我们必须知道的高速GTX技术
  • 原文地址:https://www.cnblogs.com/zhangwanying/p/9360841.html
Copyright © 2011-2022 走看看