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]
posted @ 2019-08-07 23:53  静_渊  阅读(360)  评论(0编辑  收藏  举报