什么是贪心算法?
贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。
贪婪算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。
贪心解决问题的基本思路?
1.建立数学模型来描述问题
2.把求解的问题分成若干个子问题
3.对每一子问题求解,得到子问题的局部最优解
4.把子问题对应的局部最优解合成原来整个问题的一个近似最优解
例题
1. 分配饼干
题目描述:每个孩子都有一个满足度,每个饼干都有一个大小,只有饼干的大小大于等于一个孩子的满足度,该孩子才会获得满足。求解最多可以获得满足的孩子数量。
给一个孩子的饼干应当尽量小又能满足该孩子,这样大饼干就能拿来给满足度比较大的孩子。因为最小的孩子最容易得到满足,所以先满足最小的孩子。
/*
*每个孩子都有一个满足度,每个饼干都有一个大小,只有饼干的大小大于等于一个孩子的满足度,该孩子才会获得满足。求解最多可以获得满足的孩子数量。
* */
public int findContentChildren(int[] g, int[] s) {
/*
* 思路:将所有 饼干,孩子的愿望 分别从小到大排序。
* 从小到大遍历每一个孩子的愿望, 按照饼干从小到大的顺序来满足从小到大的孩子的愿望。
* 判断当前块的饼干是否可以满足孩子的愿望。如果不能(那么后面有更大愿望的孩子就更不能满足了),所以刨除此块,继续用下一块来判断;如果能,则累计count。
* 直到饼干遍历结束或者孩子的愿望遍历结束。
* */
Arrays.sort(g);
Arrays.sort(s);
int gi = 0;
int si = 0;
int count = 0;
while (gi < s.length && si < s.length) {
if (s[si] >= g[gi]) {
count++;
gi++;
}
si++;
}
return count;
}
2. 不重叠的区间个数
题目描述:计算让一组区间不重叠所需要移除的区间个数
/*
* 计算让一组区间不重叠所需要移除的区间个数
* */
public int eraseOverlapIntervals(int[][] intervals) {
/*
* 思路:让一组区间不重叠,优先选择区间末尾值小的,这样才能让后面的区间最可能不重叠。
* 换句话说 优先选择区间末尾值小的区间,才能拼接更多的区间,移除更少的区间
* 做法:
* a.首先根据区间末尾值由小到大的顺序 将区间排序
* b.维持一个区间末尾值end
* c.按照排序后的顺序遍历所有区间,如果当前区间不会与上一个区间重叠(判断方式:当前区间的首值是否大于等于end),就更新end
* */
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[1] - o2[1];
}
});
int end = Integer.MIN_VALUE;
int removeCount = 0;
for (int i = 0; i < intervals.length; i++) {
if (in