Java Leetcode:为什么这个算法很慢?

Java Leetcode:为什么这个算法很慢?,java,algorithm,Java,Algorithm,所以我试图解决这个问题: 我的解决办法是: public class Solution { public ArrayList<Interval> merge(ArrayList<Interval> intervals) { // Start typing your Java solution below // DO NOT write main() function // ArrayList<Interval> result = ne

所以我试图解决这个问题:

我的解决办法是:

public class Solution {

public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
    // Start typing your Java solution below
    // DO NOT write main() function
    // ArrayList<Interval> result = new ArrayList<Interval>();

    //First sort the intervals
    Collections.sort(intervals,new Comparator<Interval>(){
        public int compare(Interval interval1, Interval interval2) {
            if(interval1.start >  interval2.start) return 1;
            if(interval1.start == interval2.start) return 0;
            if(interval1.start <  interval2.start) return -1;
            return 42;
        }
    });

    for(int i = 0; i < intervals.size() - 1; i++){
        Interval currentInterval = intervals.get(i);
        Interval nextInterval = intervals.get(i+1);
        if(currentInterval.end >= nextInterval.start){
            intervals.set(i,new Interval(currentInterval.start,nextInterval.end));
            intervals.remove(i+1);
            i--;
        }
    }

    return intervals;   
}
}
公共类解决方案{
公共ArrayList合并(ArrayList间隔){
//开始在下面键入Java解决方案
//不要编写main()函数
//ArrayList结果=新建ArrayList();
//首先对间隔进行排序
Collections.sort(间隔、新比较器(){
公共整数比较(间隔间隔1、间隔2){
如果(interval1.start>interval2.start)返回1;
if(interval1.start==interval2.start)返回0;
if(interval1.start=NextInServal.start){
设置(i,新间隔(currentInterval.start,nextInterval.end));
间隔。移除(i+1);
我--;
}
}
返回间隔;
}
}
我见过一些博客使用完全相同的解决方案,但被接受,但我的博客被拒绝,因为它需要太长时间。你能告诉我为什么要比预期的时间长吗? 干杯


编辑:已解决,删除成本太高,使用新的arraylist存储结果更快

您可以通过使用一次计算而不是三次比较来改进排序:

Collections.sort(intervals,new Comparator<Interval>(){
    public int compare(Interval interval1, Interval interval2) {
        return interval1.start - interval2.start;
    }
});
Collections.sort(间隔,新比较器(){
公共整数比较(间隔间隔1、间隔2){
返回interval1.start-interval2.start;
}
});

最初,您将对所有间隔进行排序-由于javadocs,此操作的复杂性为O(N*log(N))

但是,在那之后,正如我所注意到的,您正在迭代ArrayList,有时会从中删除元素

但是,从ArrayList中删除某些元素有很多好处(因为ArrayList的底层实现是普通数组——从数组中间删除任何元素都需要移动此数组的整个右侧部分)

当你们在循环中这样做的时候——最后,你们的阿尔及里图的复杂性将是O(N^2)


在这种情况下,我建议您使用LinkedList而不是ArrayList。

探查器会怎么说?这个问题似乎离题了,因为它是关于的。从ArrayList的开头->中间删除是非常昂贵的,因为每次调用都必须复制底层数组。但是一个@spongebfan告诉我们,你应该用一个剖析器来验证这一点。告诉我们这个答案是可以接受的博客@Sirko我认为这个问题在这里很好,因为它试图解决代码的一个问题——即执行时间。以哪种方式改进?@BorisTreukhov Less operations。在内部,每个比较可能至少是一个类似于我使用的计算。因此,减少这里的操作数量,应该可以提高整体运行时间。TimSort最坏的情况是n*logn,显然问题在于从阵列的中间移除,或者更聪明:而不是只检查以下项目,只要找到一个mergable元素,他就可以进行检查,然后将得到的合并间隔放入一个新列表中。我猜这就是
//ArrayList result=new ArrayList()来自。使用@ThomasJungblut建议的方法解决,将其存储在新的ArrayList中,谢谢:)