Given two lists of closed intervals, each list of intervals is pairwise disjoint and in sorted order.
Return the intersection of these two interval lists.
(Formally, a closed interval [a, b] (with a <= b) denotes the set of real numbers x with a <= x <= b. The intersection of two closed intervals is a set of real numbers that is either empty, or can be represented as a closed interval. For example, the intersection of [1, 3] and [2, 4] is [2, 3].)
Example 1:
Input: A = [[0,2],[5,10],[13,23],[24,25]], B = [[1,5],[8,12],[15,24],[25,26]]
Output: [[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]
Note:
- 0 <= A.length < 1000
- 0 <= B.length < 1000
- 0 <= A[i].start, A[i].end, B[i].start, B[i].end < 10^9
풀이
- 투포인터 사용
- A와 B 배열 각각을 가리키는 포인터를 사용한다. i와 j
- A와 B가 겹친다면 그 범위는: start = A[i][0]과 B[j][0]의 최댓값, end= A[i][1]과 B[j][1]의 최솟값 -> [start,end]일 것이다.
- A와 B가 겹치지 않는다면 start>end일 것이다. 따라서 start<=end일때만 답이 된다.
- i와 j를 움직이는 조건: A[i]와 B[j]의 오른쪽 끝값을 비교하여 작은 배열의 인덱스를 움직인다.
class Solution {
public:
vector<vector<int>> intervalIntersection(vector<vector<int>>& A, vector<vector<int>>& B) {
vector<vector<int>> answer;
int i=0, j=0;
while(i<A.size() && j<B.size()){
int start = max(A[i][0], B[j][0]);
int end = min(A[i][1], B[j][1]);
if(start<=end){
answer.push_back({start, end});
}
if(A[i][1]<B[j][1]){
i++;
}else {
j++;
}
}
return answer;
}
};
'알고리즘 문제풀이 > leetcode' 카테고리의 다른 글
[leetcode 560] Subarray Sum Equals K (0) | 2020.10.01 |
---|---|
[leetcode 1234]Replace the Substring for Balanced String (0) | 2020.10.01 |
[leetcode 1248] Count Number of Nice Subarrays (0) | 2020.10.01 |
[leetcode 1004] Max Consecutive Ones III (0) | 2020.09.30 |
[leetcode 424] Longest Repeating Character Replacement (0) | 2020.09.30 |
댓글