Niuke.com, intervalo de fusión

Descripción del Título

Inserte la descripción de la imagen aquí

solución

Debe ordenarse en orden ascendente según la hora de inicio.

import java.util.Arrays;
import java.util.ArrayList;
import java.util.Comparator;
/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
public class Solution {
    
    
    public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
    
    
          ArrayList<Interval> result = new ArrayList<>();
        if(intervals==null || intervals.size()==0) return result;
        //按照开始时间上 升排序先,开始时间相同则按照结束时间降序
        Interval[] intervalS = new Interval[intervals.size()];
        for(int i=0;i<intervalS.length;i++){
    
    
            intervalS[i] = intervals.get(i);
        }
        Arrays.sort(intervalS,new Comparator<Interval>(){
    
    
            public int compare(Interval o1,Interval o2){
    
    
                if(o1.start>o2.start){
    
    //小的排前面
                    return 1;
                }
                return -1;
 
            }
        });
      
        //获取第一个活动作为前一个重叠区间
        int pre = 0;
         int end0 = intervalS[0].end;
         int start0 = intervalS[0].start;
        for(int i=1;i<intervals.size();i++){
    
    
            int end = intervalS[i].end;
            int start = intervalS[i].start;
            if(end0<start){
    
    //没有重叠,直接添加
                result.add(intervalS[pre]);
                //更新pre
                end0 = end;
                start0 = start;
                pre = i;
            }else{
    
    //end0>=start end0<end
                //重叠,先合并成为大的,开始时间合并
                start0 = start>start0?start0:start;//保证最小
                end0 = end>end0?end:end0;//保证最大,如果是降序排end则不需要了,直接=end
                intervalS[i].start = start0;
                intervalS[i].end = end0;
                pre = i;
                //result.add(intervalS[pre]);
                
            }
        }
        if(pre<intervals.size()){
    
    //最后一个如果没有重复则还没有添加。如果重复则pre = size-1。
            result.add(intervalS[pre]);
        }
        return result;

    }
}

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_44861675/article/details/114939261
Recomendado
Clasificación