任务
122.买卖股票的最佳时机 II
给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
思路
考虑分解最终利润,比如第3天卖,第0天买,第3天卖。利润为p[3]-p[0] == p[3]-p[2]+p[2]-p[1]+p[1]-p[0],也即是你隔了几天的买卖,都可以分解成连续买卖,即第三天卖,第0天买,就是第0天买,第1天卖,第2天买,第3天卖的组合,因此每天买卖的利润可以涵盖隔天买卖的利润。
每天都买卖,只收集每天的正利润。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
result = 0
for i in range(1,len(prices)):
if prices[i] - prices[i-1] > 0:
result += prices[i] - prices[i-1]
return result
55. 跳跃游戏
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
思路
考虑覆盖,每次走到能覆盖的最大部分,走的过程中记录更新覆盖。
class Solution:
def canJump(self, nums: List[int]) -> bool:
if len(nums) == 0: return True
cover = 1 #右开区间
#for i in range(cover+1): #py中for循环不能修改循环变量!!!
i = 0
while i < cover:
cover = max(i+nums[i]+1,cover)
if cover >= len(nums):
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]。
思路
同样考虑覆盖,curCover和nextCover分别表示当前最大覆盖和下次最大覆盖,遍历整个数组的过程中更新这两个值,每次达到当前最大覆盖时,计数加1,当下次最大覆盖达到或超过数组长度时,统计结束。这个得模拟着来看,不是很直观和好想,关键难度在编码上,就是对nextCover和curCover在模拟过程中的修改。
class Solution:
def jump(self, nums: List[int]) -> int:
if len(nums) == 1: return 0
curCover = 0
nextCover = 0
result = 0
for i in range(len(nums)):
nextCover = max(nextCover,nums[i]+i)
if i == curCover:
result += 1
curCover = nextCover
if nextCover >= len(nums)-1:
break
return result
1005. K 次取反后最大化的数组和
思路
绝对值从大到小排序,然后顺序遍历,尽量将负数变成正数,如果遍历完K仍然大于0且为奇数,则将绝对值最小的值取反。关键在于Py中自定义排序和lambda表达式的写法
class Solution:
def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
nums.sort(key=abs,reverse=True)
for i in range(len(nums)):
if k > 0 and nums[i] < 0: # 尽可能的把绝对值较大的负数变正
nums[i] *=-1
k-=1
if k%2 == 1: #K剩余奇数,如果k>0 说明数组已经全为正数,则找绝对值最小的取反
nums[-1] *= -1
res = 0
for i in range(len(nums)):
res += nums[i]
return res
心得体会
- 买卖股票的时机系列问题后续可用动规解决,比较通用,只是多次买卖这道题恰好可用贪心比较简单
- 跳跃游戏中,更新覆盖的思路很难想到,特别是跳跃游戏II中的next和cur的更新。