目录
基本定义
顾名思义,贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。
1.分配问题
有一群孩子和一堆饼干,每个孩子都有一个饥饿度,每个饼干都有一个大小。每个孩子最多只能吃一个饼干,且只有饼干的大小大于孩子的饥饿度时,这个孩子才能吃饱,求解最多有多少个孩子可以吃饱。
输入输出样例
输入:1,2
1,2,3
输出:2
题解
因为饥饿度最小的孩子最容易吃饱,所以我们先考虑这个孩子。为了尽量使得剩下的饼干可以满足饥饿度更大的孩子,所以我们应该把大于等于这个孩子饥饿度的、且大小最小的饼干给这个孩子。满足了这个孩子之后,我们采取同样的策略,考虑剩下孩子里饥饿度最小的孩子,直到没有满足条件的饼干存在。
简而言之,这里的贪心策略是,给剩余孩子里最小饥饿度的孩子分配最小的能饱腹的饼干。至于具体实现,因为我们需要获得大小关系,一个便捷的方法就是把孩子和饼干分别排序。这样我们就可以从饥饿度最小的孩子和大小最小的饼干出发,计算有多少个对子可以满足条件。
import java.util.Arrays;
public class FindContentChildren
{
static int solution(int[] children, int[]cookies
{
Arrays.sort(children);
Arrays.sort(cookies);
int child = 0;
int cookies = 0;
while (child < children.length && cookie < cookies.length)
{
if (children[child] <= cookies[cookie++])child++;
}
return child;
}
}
2.区间问题
给定多个区间,计算让这些区间互不重叠所需要移除区间的最少个数。起止相连不算重叠。
输入输出样例
输入是一个数组,数组由多个长度固定为2的数组组成,表示区间的开始和结尾。输出一个整数,表示需要移除的区间数量。
Input:[[1,2],[2,4],[1,3]]
Output:1
在这个样例中,我们可以移除区间[1,3],使得剩余的区间[1,2], [2,4]互不重叠。
题解
在选择要保留区间时,区间的结尾十分重要:选择的区间结尾越小,余留给其它区间的空间就越大,就越能保留更多的区间。
因此,我们采取的贪心策略为,优先保留结尾小且不相交的区间。具体实现方法为, 先把区间按照结尾的大小进行增序排序,每次选择结尾最小且和前一个选择的区间不重叠的区间。在样例中,排序后的数组为[[1,2], [1,3], [2,4]]。按照我们的贪心策略,首先初始化为区间[1,2];由于[1,3]与[1,2]相交,我们跳过该区间;由于[2,4]与[1,2]不相交,我们将其保留。因此最终保留的区间为[[1,2], [2.4].
public class eraseOverlapIntervals {
static int solution(int[][] intvls) {
Arrays. sort(intvls, new Comparator<int[]>() {
@override
public int compare(int[] o1, int[] o2) {
return o1[1 ]-o2[1];
}
});
int count = 0 ;
int pre = intvls[0][1];
for (int i = 1; i < intvls.length; 1++) {
if (intv1s[i][e] >= pre) {
count++;
pre = intvls[i][1];
}
return. intvls. length- count;
}