码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-03-14 23:29:48      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:mission   应该   两个指针   cpp   sel   int   str   tco   列表   

题目

技术图片

思路

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

两个数组求解子区间的交集,我们可以设定两个指针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)

标签:mission   应该   两个指针   cpp   sel   int   str   tco   列表   

原文地址:https://www.cnblogs.com/depth-perception/p/12495099.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!