545 字
3 分钟
代码随想录算法训练营第二十四天 | 贪心算法 Part02
122. 买卖股票的最佳时机 II
LeetCode 122. Best Time to Buy and Sell Stock II
可以进行任意多次买卖(但是不能同时持有多股),问最大利润是多少。策略:只要今天比昨天贵,就卖出获利。
class Solution: def maxProfit(self, prices: List[int]) -> int: n = len(prices) # profit[i] 表示第 i 天和前一天的价格差 profit = [0] * (n - 1)
for i in range(1, n): profit[i - 1] = prices[i] - prices[i - 1]
res = 0 # 所有正利润相加即为最大利润(局部最优) for p in profit: if p > 0: res += p
return res
55. 跳跃游戏
class Solution: def canJump(self, nums: List[int]) -> bool: n = len(nums) fast = 0 # fast 代表当前能跳到的最远位置
for i in range(n - 1): fast = max(fast, i + nums[i]) # 每步都更新最远可达位置 if fast <= i: # 当前无法向前跳了,说明陷入死路 return False
# 最远能跳到最后一个位置,返回 True return fast >= n - 1
45. 跳跃游戏 II
class Solution: def jump(self, nums: List[int]) -> int: n = len(nums) fast = 0 # fast 表示当前能跳到的最远距离 end = 0 # end 表示当前跳跃的边界 res = 0 # res 记录跳跃次数
for i in range(n - 1): fast = max(fast, i + nums[i]) # 不断更新当前最远可达距离 if i == end: # 到达当前跳跃的终点,必须跳跃一次 res += 1 end = fast # 更新跳跃边界为当前最远位置
return res
1005. K 次取反后最大化的数组和
LeetCode 1005. Maximize Sum Of Array After K Negations
- 将数组按照绝对值大小降序排序。
- 优先将负数变为正数(因为对和影响最大)。
- 如果取反次数还剩且为奇数,则将最小绝对值的数字取反。
class Solution: def largestSumAfterKNegations(self, nums: List[int], k: int) -> int: # 先对数组按绝对值从大到小排序 nums.sort(key=lambda x: abs(x), reverse=True)
for i in range(len(nums)): # 优先将负数变为正数 if nums[i] < 0 and k > 0: nums[i] *= -1 k -= 1
# 如果还有剩余操作,且为奇数,需要将绝对值最小的数再取反一次 if k % 2 == 1: nums[-1] *= -1
return sum(nums)
代码随想录算法训练营第二十四天 | 贪心算法 Part02
https://fuwari.vercel.app/posts/code_musings_day_twenty-four/