122.买卖股票的最佳时机II
给你一个整数数组 prices
,其中 prices[i]
表示某支股票第 i
天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润
解题思路:
贪心策略:对于每一天与前一天的价格求出价格差,如果差值为正说明盈利。加上所有盈利的金额可利益最大化。
class Solution:def maxProfit(self, prices: List[int]) -> int:count = 0for i in range(1, len(prices)):diff = prices[i] - prices[i-1]if diff>0:count += diffreturn count
55. 跳跃游戏
给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
解题思路:
本题不需要实际考虑具体在哪一个位置上走几步能到达最后一个数,只要保证步数能覆盖到最后一个数。使用while loop进行可覆盖数字中遍历,选取cover中的最大值进行更新。
class Solution:def canJump(self, nums: List[int]) -> bool:if len(nums) == 1:return Truecover = 0i = 0while i <= cover:#选择cover范围中最大的数cover = max(cover, i+nums[i])if cover>=len(nums)-1:return Truei += 1return False
45.跳跃游戏II
给定一个长度为 n
的 0 索引整数数组 nums
。初始位置为 nums[0]
。
每个元素 nums[i]
表示从索引 i
向前跳转的最大长度。换句话说,如果你在 nums[i]
处,你可以跳转到任意 nums[i + j]
处:
0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1]
的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]
。
解题思路:
本题与上一题相似,不用在于如何移动,重点在于更新覆盖范围。设置result来记录更新次数,初始值为0。设置new_cover记录如果要更新,应该更新多少,该值记录能覆盖的最大值并在遍历的过程中更新。
class Solution:def jump(self, nums: List[int]) -> int:cover = 0result = 0i = 0next_cover = 0if len(nums) == 1:return resultwhile i<=cover:next_cover = max(next_cover, i+nums[i])print(next_cover)#当走到当前遍历最后一个值if i==cover and cover<len(nums)-1:#实行下一个更长的cover#print(i, next_cover)result += 1cover=next_coverif cover >= len(nums)-1:#如果更新后可以cover所有数字,直接breakbreakelif i==cover and cover==len(nums)-1:break#到达终点,可省i += 1return result