leetcode986-区间列表的交集(c++/python)

Posted depth-perception

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode986-区间列表的交集(c++/python)相关的知识,希望对你有一定的参考价值。

题目

技术图片

思路

看到数组子区间问题,第一步,先排序,排完再说!!!(本文默认是排序,无需操作)

两个数组求解子区间的交集,我们可以设定两个指针i和j,分别遍历数组A和数组B。

假设数组A中的一个区间为[a1,b1],数组B中的一个区间为[a2,b2],想一下什么时候两个区间无交集?

技术图片

如图所示,上述情况下,无交集!!!也就是: b1<a2 or b2<a1,那什么时候有交集?显然就是前面的式子取反,即:b1>=a2 and b2>=a1.

有交集应该如何处理呢?有哪些种情况呢?

技术图片

从上述4种情况中不难发现,交集有一个规律,即满足[max(a1,a2),min(b1,b2)].

那什么时候更新i和j呢?

技术图片

如上图,a,b是数组A的两个子区间,c是数组B的一个子区间,再判断完a和c的交集后,如果a的右区间小于c的右区间,则c还有可能和b有交集,此时应该更新数组A的i。反之,更新数组B的j。

题解

C++

class Solution {
public:
    vector<vector<int>> intervalIntersection(vector<vector<int>>& A, vector<vector<int>>& B) {
        if(A.empty() || B.empty()) return {};
        int i=0,j=0;
        vector<vector<int>> ans;
        while(i<A.size() && j<B.size())
        {
        if(A[i][0]<=B[j][1] && A[i][1]>=B[j][0])
        {  
            ans.push_back(vector<int>{max(A[i][0],B[j][0]),min(A[i][1],B[j][1])});
        }
        if(A[i][1]<B[j][1]) i++; else j++;
        }
        return ans; 
    }
};

Python

class Solution(object):
    def intervalIntersection(self, A, B):
        if(len(A)==0 or len(B)==0 ):
            return []   
        i,j=0,0 
        ans=[] 
        while(i<len(A) and j<len(B)):
            if (A[i][0]<=B[j][1] and A[i][1]>=B[j][0] ):   
                ans.append([max(A[i][0],B[j][0]),min(A[i][1],B[j][1])])
            if(A[i][1]<B[j][1]):
                i+=1 
            else:
                j+=1 
        return ans

参考

1.https://leetcode-cn.com/problems/interval-list-intersections/submissions/

以上是关于leetcode986-区间列表的交集(c++/python)的主要内容,如果未能解决你的问题,请参考以下文章

986. 区间列表的交集

986. 区间列表的交集

数组区间操作,数组中重复数相关

leetcode986

leetcode56-合并区间(c++/python)

python-leetcode42-区间合并区间列表的交集