leetcode 986 interval intersection, double pointer traversal

986. Intersection of interval lists

Moderate Difficulty 283 Favorites and Sharing Switch to English to receive dynamic feedback

Given two lists consisting of some  closed intervals firstList ,  and  secondList , where  firstList[i] = [starti, endi] and  secondList[j] = [startj, endj] . Each list of intervals is pairwise  disjoint  and  sorted  .

Returns  the intersection of these two interval lists  .

Formally, a closed interval [a, b] (where  a <= b) represents  x the set of real numbers, while  a <= x <= b .

The intersection of two closed intervals   is a set of real numbers, either the empty set or a closed interval. For example, the intersection of [1, 3] and  [2, 4] is  [2, 3] .

Example 1:

Input: firstList = [[0,2],[5,10],[13,23],[24,25]], secondList = [[1,5],[8,12],[15,24] ,[25,26]]
 Output: [[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]

Example 2:

Input: firstList = [[1,3],[5,9]], secondList = []
 Output: []

Example 3:

Input: firstList = [], secondList = [[4,8],[10,12]]
 Output: []

Example 4:

Input: firstList = [[1,7]], secondList = [[3,10]]
 Output: [[3,7]]

hint:

  • 0 <= firstList.length, secondList.length <= 1000
  • firstList.length + secondList.length >= 1
  • 0 <= starti < endi <= 109
  • endi < starti+1
  • 0 <= startj < endj <= 109
  • endj < startj+1

Number of passes: 44,426 Number of submissions: 64,986

 Solution: This question is not difficult. Just find the intersection of the intervals. Note that they are all closed intervals, and then traverse it once to get the result. As long as the ideas are clear, the code can be written over and over again.

class Solution {
public:
    vector<vector<int>> intervalIntersection(vector<vector<int>>& firstList, vector<vector<int>>& secondList) {
        vector<vector<int>> res;
        if(firstList.size()==0 || secondList.size()==0)
            return res;
        else
        {
            int i=0,j=0;
            while(i<firstList.size() && j<secondList.size())
            {
                // 如果没有交集的情况
                if(firstList[i][0]>secondList[j][1] || firstList[i][1]<secondList[j][0])
                {
                    if(firstList[i][0]>secondList[j][1])
                        j++;
                    else
                        i++;
                }
                else
                {
                    vector<int> tem;
                    int left=max(firstList[i][0],secondList[j][0]);
                    int right=min(firstList[i][1],secondList[j][1]);
                    tem.push_back(left);
                    tem.push_back(right);
                    res.push_back(tem);
                    if(firstList[i][1]<secondList[j][1])
                        i++;
                    else
                        j++;
                }
            }
            return res;
        }
    }
};

Results of the:

pass

Show details

Add notes

Execution time: 24 ms, beating 92.77% of all C++ submissions

Memory consumption: 19.3 MB, beats 8.99% of users among all C++ submissions

Passed test cases: 85/85

Guess you like

Origin blog.csdn.net/weixin_41579872/article/details/124918117