11、贪心算法

内容来自刘宇波老师玩转算法面试

1、贪心基础

455 - 分发饼干

image

1.1、图示

image

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、贪心算法与动态规划的关系

435 - 无重叠区间

image

2.1、动态规划

image

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、贪心

image

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、不能使用贪心算法

image
image

3.2、贪心算法的证明

image
image
image
image

posted @ 2023-05-29 12:11  lidongdongdong~  阅读(10)  评论(0编辑  收藏  举报