122.买卖股票的最佳时机II
给你一个整数数组 prices
,其中 prices[i]
表示某支股票第 i
天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润
解题思路:
贪心策略:对于每一天与前一天的价格求出价格差,如果差值为正说明盈利。加上所有盈利的金额可利益最大化。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
count = 0
for i in range(1, len(prices)):
diff = prices[i] - prices[i-1]
if diff>0:
count += diff
return count
55. 跳跃游戏
给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
解题思路:
本题不需要实际考虑具体在哪一个位置上走几步能到达最后一个数,只要保证步数能覆盖到最后一个数。使用while loop进行可覆盖数字中遍历,选取cover中的最大值进行更新。
class Solution:
def canJump(self, nums: List[int]) -> bool:
if len(nums) == 1:
return True
cover = 0
i = 0
while i <= cover:
#选择cover范围中最大的数
cover = max(cover, i+nums[i])
if cover>=len(nums)-1:
return True
i += 1
return 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 = 0
result = 0
i = 0
next_cover = 0
if len(nums) == 1:
return result
while 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 += 1
cover=next_cover
if cover >= len(nums)-1:#如果更新后可以cover所有数字,直接break
break
elif i==cover and cover==len(nums)-1:
break#到达终点,可省
i += 1
return result