贪心算法
保证每次操作都是局部最优的,并且最后得到的结果是全局最优的。
455. 分发饼干
题目描述:每个孩子都有一个满足度,每个饼干都有一个大小,只有饼干的大小大于等于一个孩子的满足度,该孩子才会获得满足。求解最多可以获得满足的孩子数量。
示例:
输入: [1,2,3], [1,1]
输出: 1
解释:
你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。
虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。
所以你应该输出1。
输入: [1,2], [1,2,3]
输出: 2
解释:
你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。
你拥有的饼干数量和尺寸都足以让所有孩子满足。
所以你应该输出2.
解法:
贪心问题。优先满足胃口小的小朋友的需求。
对 g 和 s 升序排序
初始化两个指针分别指向 g 和 s 初始位置
对比 g[i] 和 s[j]
g[i] <= s[j]:饼干满足胃口,孩子指针右移
g[i] > s[j]:无法满足胃口
无论满不满足胃口,都要右移饼干指针
最后返回的就是小孩的指针移动的次数
class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
g, s = sorted(g), sorted(s)
p1, p2 = 0, 0
while p1 < len(g) and p2 < len(s):
if g[p1] <= s[p2]:
p1 += 1
p2 += 1
return p1
435. 无重叠区间
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
示例:
输入: [ [1,2], [2,3], [3,4], [1,3] ]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
输入: [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。
输入: [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
解法:
按区间的结尾进行排序,每次选择结尾最小,并且和前一个区间不重叠的区间。
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
if not intervals:
return 0
intervals = sorted(intervals,key=lambda x:x[-1])
curr = 0
count = 1
for i in range(1, len(intervals)):
if intervals[curr][1] <= intervals[i][0]:
count += 1
curr = i
return len(intervals)-count
452. 用最少数量的箭引爆气球