zoukankan      html  css  js  c++  java
  • 暴力+DP:买卖股票的最佳时机

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
    如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
    注意:你不能在买入股票前卖出股票。
     
    示例 1:
    输入: [7,1,5,3,6,4]
    输出: 5
    解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
         注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

    示例 2:
    输入: [7,6,4,3,1]
    输出: 0
    解释: 在这种情况下, 没有交易完成, 所以最大利润为 0
     
    暴力:时间复杂度O(N^2)
     1 int maxProfit(int* prices, int pricesSize)
     2 {
     3     if (pricesSize == 0 || pricesSize == 1)
     4         return 0;
     5     int i, j;
     6     int sum = 0;
     7 
     8     for (i = 0; i < pricesSize-1; i++)
     9     {
    10         for (j = i + 1; j < pricesSize; j++)
    11         {
    12             sum = (sum > (prices[j] - prices[i]) ? sum : (prices[j] - prices[i]));
    13         }
    14     }
    15     
    16     return sum;
    17 }

    DP:时间复杂度O(N)

    一遍遍历,边遍历边找最小值,边进行求最大,利润去掉内层循环,只需关注最低的股票价格。

     1 int maxProfit(int* prices, int pricesSize)
     2 {
     3     if (pricesSize < 2)
     4         return 0;
     5     
     6     int sum = 0;
     7     int minVal = prices[0];
     8 
     9     for (int i = 1; i < pricesSize; i++)
    10     {
    11         sum = (sum > (prices[i] - minVal) ? sum : (prices[i] - minVal));
    12         minVal = (minVal < prices[i] ? minVal : prices[i]);
    13     }
    14 
    15     return sum;
    16 }
     
  • 相关阅读:
    DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践
    UVA10071 Back to High School Physics
    UVA10071 Back to High School Physics
    UVA10055 Hashmat the Brave Warrior
    UVA10055 Hashmat the Brave Warrior
    UVA458 The Decoder
    UVA458 The Decoder
    HDU2054 A == B ?
    HDU2054 A == B ?
    POJ3414 Pots
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12564773.html
Copyright © 2011-2022 走看看