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. 跳跃游戏#

LeetCode 55. Jump Game

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#

LeetCode 45. Jump Game 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/
作者
Jarrett
发布于
2025-07-08
许可协议
CC BY-NC-SA 4.0