zoukankan      html  css  js  c++  java
  • Leetcode-探索 | 买股票的最佳时机II

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

    设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    示例 1:

    输入: [7,1,5,3,6,4]
    输出: 7
    解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
         随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
    

    示例 2:

    输入: [1,2,3,4,5]
    输出: 4
    解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
         注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
         因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
    

    示例 3:

    输入: [7,6,4,3,1]
    输出: 0
    解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

    ——————————————————————————————————————————————

    这题很简单,不要想复杂。

    一开始可能会因为“不能同时参与多笔交易”这样的话误导,觉得必须分析极大值点否则会出错,其实不用。因为题设没有区分多笔交易与单笔交易在输出上的区别,只要去挨个数增长区间(按天计算)即可,如果题目改成需要限定买入/卖出次数,则可考虑用DP或分治求解。

     1 class Solution(object):
     2     def maxProfit(self, prices):
     3         """
     4         :type prices: List[int]
     5         :rtype: int
     6         """        
     7         i = j = 1
     8         benefit = 0
     9         list_len = len(prices)
    10         
    11         # boundary checking:
    12         if list_len <2:
    13             return 0
    14         
    15         # record each assending in the array
    16         for j in range(0, list_len-1):
    17             if prices[j+1] > prices[j]:
    18                 benefit += prices[j+1] - prices[j]
    19         
    20         return benefit
  • 相关阅读:
    mina简介
    idea编辑器jdk版本报错
    设计模式之-工厂模式
    设计模式之-外观模式
    ssm项目中bean注入失败,获取spring中指定bean之解决方案
    Jquery.Page.js 分页插件的使用
    发现某网站低级致命漏洞引发的对多用户系统安全性讨论
    C#微信公众号开发之网页授权oauth2.0获取用户基本信息(一)
    有关C#中使用if else和try catch的问题及效率问题
    C#伪静态实现的方法
  • 原文地址:https://www.cnblogs.com/qinziang/p/9201762.html
Copyright © 2011-2022 走看看