ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java leetcode之[中等]986. 区间列表的交集

2021-12-02 11:04:48  阅读:216  来源: 互联网

标签:fir java firstList int res 986 sed secondList leetcode


题目的链接在这里:https://leetcode-cn.com/problems/interval-list-intersections/

目录


题目大意

给定两个由一些 闭区间 组成的列表,firstList 和 secondList ,其中 firstList[i] = [starti, endi] 而 secondList[j] = [startj, endj] 。每个区间列表都是成对 不相交 的,并且 已经排序 。

返回这 两个区间列表的交集 。

形式上,闭区间 [a, b](其中 a <= b)表示实数 x 的集合,而 a <= x <= b 。

两个闭区间的 交集 是一组实数,要么为空集,要么为闭区间。例如,[1, 3] 和 [2, 4] 的交集为 [2, 3] 。


一、示意图

在这里插入图片描述

二、解题思路

正常逻辑

正常逻辑

代码如下:

class Solution {
    public int[][] intervalIntersection(int[][] firstList, int[][] secondList) {
        //先进行边界判断
        if(firstList.length==0||secondList.length==0){
            return new int[0][];
        }
        //参考昨天的方法 先写一个存储的数组
        List<int[]> res=new LinkedList<>();
        int fir=0;
        int sed=0;
        while (fir<firstList.length&&sed<secondList.length){
            //需要进行四个比较吗 头和头 头和尾 尾和头 尾和尾
            //直接判断 first的尾巴在不在 sec的头尾之间?
            if(firstList[fir][1]>=secondList[sed][0]&&firstList[fir][1]<=secondList[sed][1]){
                //说明在 头尾之间 那就需要判断fir的头和sec的头之间的大小了
                if(firstList[fir][0]>=secondList[sed][0]){
                    //说明firs更大
                    //那他们的交集肯定是 那就是需要fir的头和尾
                    //然后怎么改进呢
                    res.add(new int[]{firstList[fir][0], firstList[fir][1]});
                    //这两个都说明 first比sec要小了
                    fir++;
                    //sec不要移动吧
                }else{
                    //那肯定就是 那就说明是 sec的更大了 而更大表示范围更小
                    if(secondList[sed][0]<=firstList[fir][1]){
                        res.add(new int[]{secondList[sed][0], firstList[fir][1]});
                    }
                    fir++;
                }
            }else if(firstList[fir][1]<secondList[sed][0]){
                //那就说明fir都远远离开sec
                fir++;
            }else if(firstList[fir][1]>secondList[sed][1]){
                //这里出现了判断 很有可能头尾都不接 那就直接头尾进行判断吧
                //那就说明first至少包括了当前的sec
                if(firstList[fir][0]>=secondList[sed][0]){
                    //如果first 比较大的话 更好证明 fir的范围更小
                    if(firstList[fir][0]<=secondList[sed][1]) {
                        res.add(new int[]{firstList[fir][0], secondList[sed][1]});
                    }
                    //然后进行修改
                    sed++;
                }else{
                    //这才说明是 sec的头尾
                        res.add(new int[]{secondList[sed][0], secondList[sed][1]});
                    sed++;
                }
            }
        }
        /**
         * list的toArray 方法:里面有参数 res是一个list 他每一个都有一个数组 相当于他是数组的第一列 而每一列存储的 就是 数组对应的值
         * 相当于 最后返回的 就是这个 new出来的Int 而这个int中存在 res对应的值
         *   public <T> T[] toArray(T[] a) {
         *         if (a.length < size)
         *             a = (T[])java.lang.reflect.Array.newInstance(
         *                                 a.getClass().getComponentType(), size);
         *         int i = 0;
         *         Object[] result = a;
         *         for (Node<E> x = first; x != null; x = x.next)
         *             result[i++] = x.item;
         *
         *         if (a.length > size)
         *             a[size] = null;
         *
         *         return a;
         *     }
         */
        return res.toArray(new int[res.size()][]);
    }
}

在这里插入图片描述

标签:fir,java,firstList,int,res,986,sed,secondList,leetcode
来源: https://blog.csdn.net/qq_41115379/article/details/121672288

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有