标签: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