代码随想录算法训练营第三十二天|122. 买卖股票的最佳时机 II、55. 跳跃游戏、45. 跳跃游戏II

LeetCode 122. 买卖股票的最佳时机 II
题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)代码随想录算法训练营第三十二天|122. 买卖股票的最佳时机 II、55. 跳跃游戏、45. 跳跃游戏II_第1张图片

​思路:

每天都可以自由买卖,但是最多只能持有一只股票。我们可以讨论一下,假设第二天价格比第一天高,我们就算此为利润,若价格低,我们就不算。这样的话就算是连续三天是涨的,我们也可以把每一天的利润加进去,但是如果哪一天是跌的,我们就不会算入该利润。

代码:

#python
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        profit = 0
        for i in range(1, len(prices)):   //从第二天到最后一天
            tmp = prices[i] - prices[i - 1]  //算差值
            if tmp > 0:     //只要有利润,就加进去
                profit += tmp
        return profit

LeetCode 55. 跳跃游戏
题目链接:55. 跳跃游戏 - 力扣(LeetCode)代码随想录算法训练营第三十二天|122. 买卖股票的最佳时机 II、55. 跳跃游戏、45. 跳跃游戏II_第2张图片

​思路:

一个个遍历呗,先把第一个元素作为初始值,从第二个开始遍历,若初始值小于元素直接达不到,否则就把初始值更新一下,更新为最大步数,全部遍历结束说明能到,最后返回正。

代码:

#python  
class Solution:
    def canJump(self, nums: List[int]) -> bool:
        max_len = nums[0]
        for i in range(1, len(nums)):
            if max_len >= i:   无论如何该位置应该为跳跃值的覆盖范围区间内。
                max_len = max(max_len, i + nums[i])   更新最远的跳跃值
            else:
                return False
        return True

LeetCode 45. 跳跃游戏II
题目链接:45. 跳跃游戏 II - 力扣(LeetCode)代码随想录算法训练营第三十二天|122. 买卖股票的最佳时机 II、55. 跳跃游戏、45. 跳跃游戏II_第3张图片

​思路:

这一次是求最小跳跃次数,所以要用贪心策略,尽可能每次跳得尽量远,从而达成最优解,因此可以考虑dp数组。

代码:

#python  
class Solution:
    def jump(self, nums: List[int]) -> int:
        dp = [float('inf') for _ in range(len(nums))] //因为要返回最小值,每次都要比对,因此先要赋值为最大值。
        dp[0], j = 0, 0  //dp[0]还没跳,当然是0,j用来标注,避免了每次遍历重复元素
        for i in range(1, len(nums)):
            while j + nums[j] < i:  //每当值小于位置时,均要把j的位置前移(题目说一定能到达)
                j += 1
            dp[i] = min(dp[i], dp[j] + 1)  //更新一下到大当前位置的最小步数
        return dp[-1]  //返回最后一位即可知道到最后一位的最小步数

你可能感兴趣的:(算法)