刷题No18. merge-intervals(合并重叠的空间)(java)【数组】

题目:

给出一组区间,请合并所有重叠的区间。
例如,
给出[1,3],[2,6],[8,10],[15,18],
返回[1,6],[8,10],[15,18].

思路:

首先将lists中的每一个Interval的两个数字分别放入两个数组中,分别是starts数组和ends数组。

其次对starts数组和ends数组进行sort排序。

最后,对starts数组中下标为 i+1 的start和ends数组中下标为 i 的end进行比较。当下标为 i+1的start  大于 下标为i 的end 时,就新建一个Interval,进行合并有重叠区间的Interval。

代码:

package com.company;
import com.sun.corba.se.impl.naming.cosnaming.InternalBindingValue;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
//定义一个interval类型
class Interval{
    int start;
    int end;
    Interval(){
        start=0;
        end=0;
    }
    Interval(int s,int e){
        start=s;
        end=e;
    }
}

public class TestNo18 {
    public static void main(String[] args) {
        TestNo18 t = new TestNo18();
        Interval i1 = new Interval(1,3);
        Interval i2 = new Interval(2,6);
        Interval i3 = new Interval(8,10);
        Interval i4 = new Interval(15,18);
        ArrayList<Interval> a = new ArrayList<Interval>();
        a.add(i1);
        a.add(i2);
        a.add(i3);
        a.add(i4);
//        for(Interval j :t.merge(a)){
//            System.out.print(j);
//        }
        for(int i = 0;i<t.merge(a).size();i++){
            System.out.println(t.merge(a).get(i).start+","+t.merge(a).get(i).end);
        }

    }
    public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
        ArrayList<Interval> result = new ArrayList<Interval>();
        if(intervals == null || intervals.size()<1){
            return result;
        }
        int len = intervals.size();
        int[] starts = new int[len];
        int[] ends = new int[len];
        //将每一个interval的首尾整数分别放置在两个数组中,尾部放置在end数组中
        for(int i=0;i<len;i++){
            starts[i] = intervals.get(i).start;
            ends[i] = intervals.get(i).end;
        }
        //分别对两个数组进行排序
        Arrays.sort(starts);
        Arrays.sort(ends);
        //将重叠的interval进行合并
        for(int i =0,j=0;i<len;i++){
            if(i==len-1 || starts[i+1] > ends[i]){
                result.add(new Interval(starts[j],ends[i]));
                j = i+1;
            }
        }
        return result;
    }
}
发布了46 篇原创文章 · 获赞 11 · 访问量 3586

猜你喜欢

转载自blog.csdn.net/qq_40664693/article/details/104210625