力扣第57题 困难难度 插入区间。暴力解法 考虑所有的情况,180行代码。做出来就和没做出来一球样,重点标记,以后重做!

题目:
在这里插入图片描述

暴力解法代码,考虑所有情况:

public int[][] insert(int[][] intervals, int[] newInterval) {
        if(intervals.length==0){
            int[][]res = new int[1][2];
            res[0][0]=newInterval[0];
            res[0][1]=newInterval[1];
            return res;
        }
            
        int intervalsCount = 0; //将把原有的这么多个区间合并为1个区间
        //找到合并后区间的left,刚好小于等于newInterval[0]的数
        int left=0,right = 0;
        int i = 0,j = 0;
        for(i = 0 ; i < intervals.length ; i++){
            if(intervals[i][0] > newInterval[0]){
                left = i;
                break;
            }
        }
        left--;
        
        if(left<-1)
            left=-1;
        else if(left==-1)
            left=0;
        if (intervals[left][1] < newInterval[0])
            left++;
        if(i == intervals.length){
            if(newInterval[0]>intervals[i-1][1]){
                int[][]res = new int[intervals.length+1][2];
                for(int k = 0 ; k < intervals.length ; k++){
                    res[k][0]=intervals[k][0];
                    res[k][1]=intervals[k][1];
                }
                res[intervals.length][0]=newInterval[0];
                res[intervals.length][1]=newInterval[1];
                return res;
            }
            left = i-1;
            
        }
        //找到合并后区间的right,刚好大于等于newInterval[1]的数
        for(j = left ; j < intervals.length ; j++){
            intervalsCount++;
            if(intervals[j][1] == newInterval[1]){
                right = j;
                break;
            }
            else if(intervals[j][1] > newInterval[1]){
                right = j-1;
                intervalsCount--;
                if(right<left){
                    if (newInterval[1] < intervals[left][0]) {
                        left = -1;
                        break;
                    }
                    right=left;
                    intervalsCount=1;
                    break;
                }
                //再判断一下j指向的第一个数是不是正好大于等于newInterval[1]
                if(newInterval[1]>=intervals[j][0]){
                    right++;
                    intervalsCount++;
                }
                break;
            }
        }
        if(j==intervals.length){
            if(newInterval[1]>=intervals[intervals.length-1][0])
                right = intervals.length-1;
            else
                right = -1;
        }
        //开始构造返回的数组
        if(left==-1){
            int[][]res = new int[intervals.length+1][2];
            res[0][0]=newInterval[0];
            res[0][1]=newInterval[1];
            for(int k = 0,l=1 ; k < intervals.length ; k++,l++){
                res[l][0]=intervals[k][0];
                res[l][1]=intervals[k][1];
            }
            res = merge(res);
            return res;
        }
        if(right==-1){
            int[][]res = new int[left+1][2];
            for(int k = 0 ; k < left ; k++){
                res[k][0]=intervals[k][0];
                res[k][1]=intervals[k][1];
            }
            res[left][0]=intervals[left][0];
            res[left][1]=newInterval[1];
            return res;
        }
        int[][]res = new int[intervals.length-intervalsCount+1][2];
        for(int k = 0 ; k < left ; k++){
            res[k][0]=intervals[k][0];
            res[k][1]=intervals[k][1];
        }
        res[left][0] = intervals[left][0] < newInterval[0] ? intervals[left][0] : newInterval[0];
        res[left][1]=newInterval[1]>intervals[right][1]?newInterval[1]:intervals[right][1];
        for(int k = left+1,l=right+1 ; l<intervals.length;l++,k++){
            res[k][0]=intervals[l][0];
            res[k][1]=intervals[l][1];
        }
        return res;
    }


    //第56题的合并区间
    public int[][] merge(int[][] intervals) {
        //0和1,则返回自身
        if (intervals.length<=1)
            return intervals;
        //先排序
        Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
        for (int i = 0; i < intervals.length; i++) {
            //注意 TreeMap只允许相同的key只有一个,因此如果新的key对应的value大,则更新,否则不更新
            if(map.containsKey(intervals[i][0])&&intervals[i][1]<map.get(intervals[i][0]))
                continue;
            map.put(intervals[i][0], intervals[i][1]);
        }
        //使用set的迭代器来遍历map
        Set<Integer> keySet = map.keySet();
        Iterator<Integer> iterator = keySet.iterator();
        int i = 0;
        while (iterator.hasNext()) {
            intervals[i][0] = iterator.next();
            intervals[i][1] = map.get(intervals[i][0]);
            i++;
        }
        //开始合并区间
        List<Integer[]> list = new ArrayList<>();
        i = 0;
        while (i < intervals.length-1) {
            if(intervals[i][1]>=intervals[i+1][0]){
                Integer[] arr = new Integer[2];
                arr[0]=intervals[i][0];
                int max = intervals[i+1][1]>intervals[i][1]?intervals[i+1][1]:intervals[i][1];
                arr[1]= max;
                i++;
                while (i < intervals.length-1 && max>=intervals[i+1][0]){
                    arr[1]=intervals[i+1][1]>arr[1]?intervals[i+1][1]:arr[1];
                    i++;
                    //更新max
                    max = arr[1];
                }
                list.add(arr);
                i++;
            }
            else {
                list.add(new Integer[]{intervals[i][0],intervals[i][1]});
                i++;
            }
        }
        //最后看一下intervals[intervals.length-1][1]这个数是不是大于list中最后一个数组的第二个数,如果大于的话,则加入
        if(list.get(list.size()-1)[1] < intervals[intervals.length-1][1]){
            list.add(new Integer[]{intervals[intervals.length-1][0], intervals[intervals.length-1][1]});
        }

        int[][] resArr = new int[list.size()][2];
        for(i=0;i<list.size();i++){
            resArr[i][0]=list.get(i)[0];
            resArr[i][1]=list.get(i)[1];
        }
        return resArr;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值