贪心算法(Greedy Algorithm) 是一种在每一步选择中都采取当前状态下最优决策的算法思想,常用于解决最优化问题。其核心在于:局部最优解能否推导出全局最优解。
本文从基础概念到经典题型进行系统分类与解析,涵盖从入门到进阶的所有常见问题。
pythondef eraseOverlapIntervals(intervals):
if not intervals: return 0
intervals.sort(key=lambda x: x[1])
count = 1
end = intervals[0][1]
for i in range(1, len(intervals)):
if intervals[i][0] >= end:
count += 1
end = intervals[i][1]
return len(intervals) - count
pythondef merge(intervals):
intervals.sort(key=lambda x: x[0])
merged = []
for interval in intervals:
if not merged or merged[-1][1] < interval[0]:
merged.append(interval)
else:
merged[-1][1] = max(merged[-1][1], interval[1])
return merged
pythondef findContentChildren(g, s):
g.sort()
s.sort()
i = j = 0
while i < len(g) and j < len(s):
if s[j] >= g[i]: i += 1
j += 1
return i
pythondef canJump(nums):
max_reach = 0
for i in range(len(nums)):
if i > max_reach: return False
max_reach = max(max_reach, i + nums[i])
return True
pythondef jump(nums):
steps = 0
cur_end = 0
max_reach = 0
for i in range(len(nums) - 1):
max_reach = max(max_reach, i + nums[i])
if i == cur_end:
steps += 1
cur_end = max_reach
return steps
pythondef maxProfit(prices):
profit = 0
for i in range(1, len(prices)):
if prices[i] > prices[i-1]:
profit += prices[i] - prices[i-1]
return profit
pythondef partitionLabels(s):
last = {c: i for i, c in enumerate(s)}
start = end = 0
res = []
for i, c in enumerate(s):
end = max(end, last[c])
if i == end:
res.append(end - start + 1)
start = end + 1
return res
类型 | 经典题目 |
---|---|
区间问题 | 435. 无重叠区间、56. 合并区间 |
分配问题 | 455. 分发饼干、621. 任务调度器 |
跳跃游戏 | 55. 跳跃游戏、45. 跳跃游戏 II |
买卖股票 | 122. 买卖股票 II、714. 含手续费 |
字符串问题 | 763. 划分字母区间、316. 去除重复字母 |
贪心算法的核心在于通过局部最优选择构造全局最优解。
掌握要点:
📌 推荐练习顺序:区间问题 → 分配问题 → 跳跃游戏 → 买卖股票 → 字符串问题
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!