zoukankan      html  css  js  c++  java
  • leetcode 股票问题

    leetcode 股票问题

    参考:labuladong

    (leetcode-121) 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。

    class Solution:
        def maxProfit(self, prices: List[int]) -> int:
            minp = float('inf')
            maxpr = float('-inf')
            if not prices:
                return 0
            for i,v in enumerate(prices):
                minp = min(minp,v)
                maxpr = max(v-minp,maxpr)
            return maxpr
    
    class Solution:
        def maxProfit(self, prices: List[int]) -> int:
            if not prices:
                return 0
            dp = [[0,0] for _ in range(1+len(prices))]
            dp[0][1]=-prices[0]
            for i in range(1,len(prices)):
                dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i])
                dp[i][1]=max(dp[i-1][1],-prices[i])
            return dp[len(prices)-1][0]
    

    (leetcode-122) 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
    思路一:只要第二天价格高,我就买

    class Solution:
        def maxProfit(self, prices: List[int]) -> int:
            sumr = 0
            if len(prices) == 0:
                return 0
            for i in range(1,len(prices)):
                tmp = prices[i] - prices[i-1]
                if tmp > 0:
                    sumr += tmp
            return sumr
    

    思路二:两种情况,cash表示我有现金:1)持有原来的;2)把股票卖出去,赚了当前股票的钱;hold表示持有股票:1)持有原来的股票;2)用cash买入股票;

    class Solution:
        def maxProfit(self, prices: List[int]) -> int:
            if not prices:
                return 0
            cash = 0
            hold = -prices[0]
            n = len(prices)
            for i in range(1,n):
                cash = max(cash,hold+prices[i])
                hold = max(hold,cash-prices[i])
            return cash
    

    (leetcode-714) 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每次交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。
    同leetcode 221 第二种思路一样,多了要付手续费;

    class Solution:
        def maxProfit(self, prices: List[int], fee: int) -> int:
            ca = 0
            hd = -prices[0]
            for i in range(1,len(prices)):
                ca = max(ca,hd+prices[i]-fee)
                hd = max(hd,ca-prices[i])
            return ca
    

    (leetcode-309) 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
    思路:这时候买股票hold的时候的cash不是i-1的,而是i-2的

    class Solution:
        def maxProfit(self, prices: List[int]) -> int:
            if not prices:
                return 0
            cash = 0
            hold = -prices[0]
            cash_pre = 0
            for i in range(1,len(prices)):
                tmp = cash
                cash = max(cash,hold+prices[i])
                hold = max(hold,cash_pre-prices[i])
                cash_pre = tmp
            return cash
    

    (leetcode-123)给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    class Solution:
        def maxProfit(self, prices: List[int]) -> int:
            if not prices:
                return 0
            cash_1 = 0
            cash_2 = 0
            hold_1 = -prices[0]
            hold_2 = -prices[0]
            for i in range(1,len(prices)):
                cash_1 = max(cash_1,hold_1+prices[i]) // 把第二次的股票卖了
                hold_1 = max(hold_1,cash_2-prices[i]) // 拿第一次的钱买第二次的股票
                cash_2 = max(cash_2,hold_2+prices[i]) // 把第一次持有的股票卖了
                hold_2 = max(hold_2,-prices[i]) // 第一次买股票
            return cash_1
    

    (leetcode-188) 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    class Solution:
        def maxProfit(self, k: int, prices: List[int]) -> int:
            if not prices:
                return 0
            n = len(prices)
            if k > n:
                sumr = 0
                if len(prices) == 0:
                    return 0
                for i in range(1,len(prices)):
                    tmp = prices[i] - prices[i-1]
                    if tmp > 0:
                        sumr += tmp
                return sumr
    
            g = [0] * (k + 1)
            l = [0] * (k + 1)
            for i in range(n - 1):
                diff = prices[i + 1] - prices[i]
                for j in range(k, 0, -1):
                    l[j] = max(g[j - 1] + max(diff, 0), l[j] + diff)
                    g[j] = max(l[j], g[j])
            return g[-1]
    
  • 相关阅读:
    043_MySQL 索引原理 与 慢查询优化
    042_MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】
    041_SQL逻辑查询语句执行顺序
    039_MySQL 数据操作
    040_数据库设计三范式
    039_MySQL_多表查询
    039_MySQL_单表查询
    038_MySQL 表的操作
    MySQL 存储引擎
    037_MySQL操作
  • 原文地址:https://www.cnblogs.com/curtisxiao/p/11318648.html
Copyright © 2011-2022 走看看