11、贪心算法
1、贪心基础
1.1、图示
1.2、实现
public static int findContentChildren(int[] g, int[] s) {
Arrays.sort(s); // 饼干
Arrays.sort(g); // 小朋友
int res = 0;
int si = s.length - 1; // 最大的饼干
int gi = g.length - 1; // 最贪心的小朋友
while (gi >= 0 && si >= 0) {
if (s[si] >= g[gi]) {
res++;
si--;
gi--;
} else gi--;
}
return res;
}
更多问题
392 - 判断子序列
2、贪心算法与动态规划的关系
2.1、动态规划
public static int eraseOverlapIntervals(int[][] intervals) {
if (intervals.length == 0) return 0;
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] != o2[0]) return o1[0] - o2[0];
return o1[1] - o2[1];
}
});
// memo[i] = 用 intervals[0 ... i] 的区间, 能构成的 "最长不重叠区间序列" 的长度
int[] memo = new int[intervals.length];
Arrays.fill(memo, 1);
for (int i = 1; i < intervals.length; i++) {
// 求解 memo[i]
for (int j = 0; j <= i - 1; j++) {
if (intervals[i][0] >= intervals[j][1]) memo[i] = Math.max(memo[i], 1 + memo[j]);
}
}
int max = Arrays.stream(memo).max().getAsInt();
return intervals.length - max;
}
2.2、贪心
public static int eraseOverlapIntervals(int[][] intervals) {
if (intervals.length == 0) return 0;
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[1] != o2[1]) return o1[1] - o2[1];
return o1[0] - o2[0];
}
});
int res = 1;
int pre = 0; // intervals[pre] 为上一个保留的区间
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] >= intervals[pre][1]) {
res++;
pre = i;
}
}
return intervals.length - res;
}
3、贪心选择性质的证明
如果无法使用贪心算法,举出反例即可
在求解一个最优化的问题中,我们使用贪心的方式选择了一组内容之后,不会影响剩下的子问题的求解
3.1、不能使用贪心算法
3.2、贪心算法的证明
本文来自博客园,作者:lidongdongdong~,转载请注明原文链接:https://www.cnblogs.com/lidong422339/p/17440103.html