leetcode56——合并区间

题意:

 解法1:

class Solution {
    public int[][] merge(int[][] intervals) {//n行  2列
        //尾元素 大于下一组的首元素 就要合并
        //先进行数组 排序 即 [1,3]  [2,6]
        if(intervals.length==1) return intervals;
        int[][] res=new int[intervals.length][];

        ArrayList<int[]> list=new ArrayList<>();

        //按首元素 进行排序
        intervals=sortmaopao(intervals);

        int big=0;

        int start1=0;
        int start2=0;
        int end1=0;
        int end2=0;

        int count=0;
        for(int k=0;k<intervals.length;k++){
            big=k+1;
            //if(big==intervals.length) break;// big  可能会有一个越界问题
            if(k==intervals.length-1){
                //添加
                //res[count]=intervals[k];
                list.add(new int[] {intervals[k][0],intervals[k][1]});
                break;
            }

            start1=intervals[k][0];
            end1=intervals[k][1];
            start2=intervals[big][0];
            end2=intervals[big][1];
            if(end1>=start2){
                //缩小处理

                if(end1>end2){
                    //直接加入  k所在数组
                    intervals[big]=intervals[k];//更新 big值

                    //list.add(intervals[k]);
                }else{
                    //取k的首  取big的尾
                    intervals[big][0]=start1;//更新big值
                    //list.add(intervals[big]);
                }

                //如何更新呢
            }else{
                //list.add(intervals[k]);
                //res[count++]=intervals[k];

                list.add(new int[] {intervals[k][0],intervals[k][1]});
            }

        } 

       // return res;
       return  list.toArray(new int[list.size()][2]);


    }

    //先将数组进行排序
    public int[][] sortmaopao(int[][] intervals){
        if(intervals.length==1) return intervals;

        //利用冒泡排序 
        int[] tem=null;
        for(int i=0;i<intervals.length;i++){
            for(int j=i+1;j<intervals.length;j++){
                if(intervals[i][0]>intervals[j][0]){
                    tem=intervals[i];

                    intervals[i]=intervals[j];

                    intervals[j]=tem;
                }
            }
        }

        return intervals;
    }
}

思路: 原数组 是一个n行 2列的数组

先按照每行的首 num 进行排序

然后分情况比较

知识点:

如何返回一个保存不定长度的数组呢?

如果使用int[] num=new int[x];  那么数组长度一开始就固定死了,当然你也可以通过Array去操作 但略显麻烦

推荐方法:

第一步:
集合返回数组  即 list.toArray()

ArrayList<int[]> list=new ArrayList<>();

第二步:

本题是要返回一个二维数组   ,而 集合返回的是一个一维数组,

那么我们在添加元素的时候 在一维数组里  加入一维数组即可

list.add(new int[] {intervals[k][0],intervals[k][1]});

第三步:

list.Array()  是集合转换为数组的方法

list.toArray(new int[list.size()][2])  是定义一个多大的数组

list.toArray(new int[list.size()][2])

# 排序

排序算法累计ing

解法2

先进行二维数组排序
按照二维数组的0号元素进行从小到大排序

设置一个右边界pos,后续数组的左边界小于等于pos都是和pos有交集的,同时每次都更新一下pos

for循环结束之后 将最后一组边界数值加入list

ArrayList加入数组 (泛型首先是数组) list.add(new int[] {num1,num2});
ArrayList转化为n*m数组 list.toArray(new int[m][n]);

class Solution {
    public int[][] merge(int[][] intervals) {
        int n=intervals.length;
        if(n==1) return intervals;
        //结果返回数组格式
        //ArrayList  .toArray(new int[list.size()][2]);
        //按0号元素进行从小到大排序
        ArrayList<int[]> list=new ArrayList<>();
        Arrays.sort(intervals,new Comparator<int[]>(){
            public int compare(int[] p1,int[] p2){
                if(p1[0]>p2[0]){
                    return 1;
                }else if(p1[0]<p2[0]){
                    return -1;
                }else{
                    return 0;
                }
            }
        });

        int pos=intervals[0][1];
        int left=intervals[0][0];
        int right=intervals[0][1];
        //将pos表示右边界  判断后续排序的数组的左边界是否在范围之内。
        for(int i=1; i<n;i++){
            if(pos>=intervals[i][0]){
                //有交集 更新左右范围
                //left=Math.min(left , intervals[i][0]);
                right=Math.max(right,intervals[i][1]);
                pos=right;
            }else{
                //无交集 加入数组 改变pos
                list.add(new int[]{left,right});//加入链表
                pos=intervals[i][1];
                left=intervals[i][0];
                right=intervals[i][1];
            }
        }
        //跳出循环 加入最后一个左右范围
        list.add(new int[]{left,right});


        return list.toArray(new int[list.size()][2]);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值