算法训练Day49 | Leetcode121. 买卖股票的最佳时机(只能买卖一次);LeetCode122. 买卖股票的最佳时机II(可以买卖多次)

这篇博客详细解析了LeetCode121和122题,分别是买卖股票的最佳时机(只能买卖一次)和(可以买卖多次)。文章介绍了暴力解法、贪心算法和动态规划三种解题思路,并提供了每种方法的代码实现,复杂度分析和思考与收获。
摘要由CSDN通过智能技术生成

目录

Leetcode121. 买卖股票的最佳时机

方法一:暴力解法

1. 思路

2. 代码实现

3. 复杂度分析

4. 思考与收获

方法二:贪心算法

1. 思路

2. 代码实现

3. 复杂度分析

方法三:动态规划

1. 思路

2. 代码实现

3. 复杂度分析

4. 思考与收获

LeetCode122. 买卖股票的最佳时机II

1. 思路

2. 代码实现

3. 复杂度分析

4. 思考与收获


Leetcode121. 买卖股票的最佳时机

 链接:121. 买卖股票的最佳时机 - 力扣(LeetCode)

方法一:暴力解法

1. 思路

因为只能买一次,卖一次,所以这道题目最直观的想法就是暴力找最优间距,外层for loop从头到尾遍历元素,内层for loop从i之后遍历元素;

2. 代码实现

# 方法一:暴力解法
# time:O(N^2);space:O(1)
class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        result = 0
        for i in range(len(prices)-1):
            for j in range(i+1,len(prices)):
                result = max(result,prices[j]-prices[i])
        return result

3. 复杂度分析

  • 时间复杂度:O(N^2)

    其中,N为prices数组的长度;两层for loop的时间复杂度为O(N^2);

  • 空间复杂度:O(1)

    只有result一个变量储存,为常数级的空间复杂度

4. 思考与收获

  1. 此方法在LeetCode提交中超时了;

方法二:贪心算法

1. 思路

因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。

2. 代码实现

# 方法二:贪心做法
# time:O(n);space:O(1)
class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        low = float("inf")
        result = 0
        for i in range(len(prices)):
            low = min(low,prices[i]) # [0,i]位置的最小值
            result = max(result,prices[i]-low) # 目前可以得到的最大利润
        return result

3. 复杂度分析

  • 时间复杂度:O(N)

    其中N为prices的长度;需要遍历一遍整个数组,因此复杂度为O(N);

  • 空间复杂度:O(1)

    只有两个变量储存信息,分别是low和result,常数级的空间复杂度;

方法三:动态规划

1. 思路

动规五部曲分析如下:

1.1 确定dp数组及下标的含义

  • dp[i][0]

    dp[i][0] 表示第i天持有股票所得最多现金 ,这里可能有同学疑惑,本题中只能买卖一次,持有股票之后哪还有现金呢?其实一开始现金是0,那么加入第i天买入股票现金就是 -prices[i], 这是一个负数;

  • dp[i][1]

    dp[i][1] 表示第i天不持有股票所得最多现金,注意这里说的是“持有”,“持有”不代表就是当天“买入”!也有可能是昨天就买入了,今天保持持有的状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值