fucking-algorithm icon indicating copy to clipboard operation
fucking-algorithm copied to clipboard

贪心算法之区间调度问题 :: labuladong的算法小抄

Open utterances-bot opened this issue 3 years ago • 12 comments

文章链接点这里:贪心算法之区间调度问题

评论礼仪 见这里,违者直接拉黑。

utterances-bot avatar Jul 22 '21 20:07 utterances-bot

提一个小点:

Arrays.sort(intvs, new Comparator<int[]>() {
        public int compare(int[] a, int[] b) {
            return a[1] - b[1];
        }
    });
最好改成后面的这个:
        Arrays.sort(points, (o1,o2)->{
            if(o1[1]>o2[1]) return 1;
            if(o1[1]<o2[1]) return -1;
            return 0;
        });

直接返回return a[1] - b[1];容易发生数据溢出;

xiaozhi007 avatar Jul 22 '21 20:07 xiaozhi007

笔试题,卧槽

xiaoye-2018 avatar Jul 24 '21 01:07 xiaoye-2018

@xiaozhi007 你说的对,这个细节值得注意👍

labuladong avatar Jul 30 '21 02:07 labuladong

Arrays.sort(points, Comparator.comparingInt(t -> t[1]));

这样可以避免排序时return a[1] - b[1];溢出。

z-ak-z avatar Jan 06 '22 11:01 z-ak-z

可以按start排序吗?

qihang-dai avatar Feb 01 '22 19:02 qihang-dai

贪心算法可以认为是动态规划算法的一个特例 那是否认为所有的贪心解法都可以用动态规划来实现呢?

polaris-dxz avatar Feb 14 '22 07:02 polaris-dxz

@Yggdrasill-7C9 动态规划可以认为是含有重叠子问题的暴力算法,本质还是要穷举所有解空间,而贪心的精髓在于不用穷举所有解空间,就能找到答案。所以准确说应该是,能够用贪心算法解决的问题,一定能用暴力穷举的方式求解。

当然,几乎所有计算机算法问题,都能用暴力穷举的方式求解。。。

labuladong avatar Feb 16 '22 03:02 labuladong

关于溢出问题,可使用以下解法

class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points, (a, b) -> {
            return Integer.compare(a[1], b[1]);
        });

        int count = 1;
        int end = points[0][1];
        for (int[] point : points) {
            int start = point[0];
            if (start > end) { // 找到不重叠区间(边界重叠也算重叠)
                count++;
                end = point[1];
            }
        }
        return count;
    }
}

Leloz00 avatar Feb 24 '22 06:02 Leloz00

三种排序方法的对比

        // Arrays.sort(points,(a,b)->(a[1]-b[1]));// 可能出现溢出情况

        // Arrays.sort(points,Comparator.comparingInt(a->a[1]));//升序排序 解决溢出方法2  效率较低 调用内置静态方法, 效率较低
        Arrays.sort(points,(a,b)->{
            if(a[1]>b[1]) return 1;
            if(a[1]<b[1]) return -1;
            return 0;//上述方法可能溢出 解决方法1
        });

zhongweiLeex avatar Mar 29 '22 02:03 zhongweiLeex

sort的排序方法中,用a[1] - b[1]会出现溢出的问题

awei-lwj avatar Apr 22 '22 02:04 awei-lwj

6666

steemie avatar Apr 23 '22 08:04 steemie

Arrays.sort(points, (a, b)->(Integer.compare(a[1], b[1])));

deepbreath373 avatar Jul 27 '22 13:07 deepbreath373

东哥,你好,请教一个关于区间调度问题的进阶题的解法,今天大疆的笔试题,没有想到好的方法。 题目的是:输入一个数组,表示一系列的任务,每个任务有一个权重w,开始时间starTime,结束时间endTime。现在要求的是,无时间冲突的情况下的所有调度方式中加权权重和最大的调度方式任务在数组中的索引,也就是在这些任务中,选择一些任务,要求这些任务的时间不能冲突,并且这些任务的权重和加起来最大,然后输出这些任务在原始数组中的索引。 只相到一个回溯方法,要是不考虑权重就可以按照你上面讲解的方式做,现在加了权重感觉不好搞。

aristo-panhu avatar Aug 14 '22 12:08 aristo-panhu

东哥,你好,请教一个关于区间调度问题的进阶题的解法,今天大疆的笔试题,没有想到好的方法。 题目的是:输入一个数组,表示一系列的任务,每个任务有一个权重w,开始时间starTime,结束时间endTime。现在要求的是,无时间冲突的情况下的所有调度方式中加权权重和最大的调度方式任务在数组中的索引,也就是在这些任务中,选择一些任务,要求这些任务的时间不能冲突,并且这些任务的权重和加起来最大,然后输出这些任务在原始数组中的索引。 只相到一个回溯方法,要是不考虑权重就可以按照你上面讲解的方式做,现在加了权重感觉不好搞。

有没有相关把权重也当作数组的一个维度 排序呢 , 然后在之前的二维数组的基础上再扩展出一个维度呢 (只是普通猜测)

zhongweiLeex avatar Aug 14 '22 13:08 zhongweiLeex

东哥,你好,请教一个关于区间调度问题的进阶题的解法,今天大疆的笔试题,没有想到好的方法。 题目的是:输入一个数组,表示一系列的任务,每个任务有一个权重w,开始时间starTime,结束时间endTime。现在要求的是,无时间冲突的情况下的所有调度方式中加权权重和最大的调度方式任务在数组中的索引,也就是在这些任务中,选择一些任务,要求这些任务的时间不能冲突,并且这些任务的权重和加起来最大,然后输出这些任务在原始数组中的索引。 只相到一个回溯方法,要是不考虑权重就可以按照你上面讲解的方式做,现在加了权重感觉不好搞。

有没有相关把权重也当作数组的一个维度 排序呢 , 然后在之前的二维数组的基础上再扩展出一个维度呢 (只是普通猜测)

那按照你的思路的话,我们到底该怎么排序呢,首先按照权重排序吗?然后再根据开始时间或者结束时间?如果先按照权重排序的话,后面的时间就是无规律的了呀,就不能按照东哥上面讲解的方式解答了呀。

aristo-panhu avatar Aug 14 '22 13:08 aristo-panhu

@aristo-panhu 我估计要用 TreeMap + 动态规划来做,穷举所有可能的安排方法求最值。我记得 LeetCode 上好像有类似的题目,有空找出来发在这。

labuladong avatar Aug 15 '22 05:08 labuladong

@aristo-panhu 我思考了一下能不能在做贪心排序的同时用dp 穷举所有可能的组合取最大值?

MzxlM avatar Aug 19 '22 10:08 MzxlM