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]

原文地址:https://www.cnblogs.com/curtisxiao/p/11318648.html

时间: 2024-11-05 14:53:00

leetcode 股票问题的相关文章

我的校招季大概也是结束了。

其实,不知道该写什么.这些天,腾讯的offer让我有些飘飘然,让我有些晕乎乎,我有的时候很看得起自己,有的时候又很看不起自己. 说到底,我觉得自己只是比别人执拗一点,坚持一点. 论聪明,我绝对是一般的才智,比下有余,比上不足.我有一些小聪明,思维转动比一些人快,常常能想到很多方面,却不集中. 论代码功底,我更是不如很多代码大牛.常常有人问我,写过的代码有多少行,我没敢说,我知道,不多.这也是我的劣势之一,以后无论是在学习还是工作中,都要以此为奋斗目标之一. 论算法,看到dp和递归的一些思路,我经

出错啦!

Leetcode股票问题总结 ADB使用总结 Java文件重命名 SpringBoot文件操作的一些问题 Android常见安装apk问题 FlowDroid介绍,源码分析及功能修改 Java文件重命名 Java文件读写总结 Android短信总结 深入理解JVM总结 设计模式(6)--观察者模式 Java面试总结(1) 设计模式(5)--组合模式 设计模式(4)--装饰器模式 大专栏  出错啦!B%E6%A8%A1%E5%BC%8F" class="title">设计

leetcode——Best Time to Buy and Sell Stock III 买卖股票最大收益(AC)

Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete at most two transactions. Note: You may not engage in multiple transactions at the same time (ie,

[LeetCode] 123. Best Time to Buy and Sell Stock III 买卖股票的最佳时间 III

Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete at most two transactions. Note:You may not engage in multiple transactions at the same time (ie,

leetcode 买卖股票的最佳时机Ⅱ

给定一个数组,它的第?i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票). 示例 1: 输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 . ? 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(

【Leetcode】【简单】【122. 买卖股票的最佳时机 II】【JavaScript】

题目描述 122. 买卖股票的最佳时机 II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票). 示例 1: 输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 .随后,在第 4 天(股票价格

每日一题-——LeetCode(121)买卖股票的最佳时机

题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格.如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润.注意你不能在买入股票前卖出股票. 示例 输入: [7,1,5,3,6,4] 输出:5 定义:minval = min(minval,prices[i]) 当前的最小价格 maxp = max(maxp,prices[i]-minval) 当前的最大利润 class Solution(object): def maxProfit(

LeetCode | 0121. Best Time to Buy and Sell Stock买卖股票的最佳时机【Python】

LeetCode 0121. Best Time to Buy and Sell Stock买卖股票的最佳时机[Easy][Python][贪心] Problem LeetCode Say you have an array for which the ith element is the price of a given stock on day i. If you were only permitted to complete at most one transaction (i.e., b

LeetCode——714. 买卖股票的最佳时机含手续费.

给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :非负整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你每次交易都需要付手续费.如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了. 返回获得利润的最大值. 示例 1: 输入: prices = [1, 3, 2, 8, 4, 9], fee = 2 输出: 8 解释: 能够达到的最大利润: 在此处买入 prices[0] = 1 在此处卖出 prices[3] = 8 在此处买入 p