[그라인드 75] 57. 간격 삽입

설명



겹치지 않는 간격 배열intervals이 제공됩니다. 여기서 intervals[i] = [starti, endi]ith 간격의 시작과 끝을 나타내고 intervalsstarti에 의해 오름차순으로 정렬됩니다. 또한 다른 간격의 시작과 끝을 나타내는 간격newInterval = [start, end]도 제공됩니다.
newIntervalintervals에 의해 오름차순으로 정렬되고 intervals에 여전히 겹치는 간격이 없도록 startiintervals에 삽입합니다(필요한 경우 겹치는 간격 병합).

삽입 후 반환intervals

예 1:




Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
Output: [[1,5],[6,9]]


예 2:




Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
Output: [[1,2],[3,10],[12,16]]
Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].


제약:


  • 0 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 105
  • intervalsstarti를 기준으로 오름차순으로 정렬됩니다.
  • newInterval.length == 2
  • 0 <= start <= end <= 105



  • 솔루션



    솔루션 1



    직관


  • 왼쪽: end < newStart
  • 대상: newStart = min(start, newStart); newEnd보다 작은 마지막 시작을 찾고 newEnd = max(end, newEnd)를 업데이트합니다.
  • 오른쪽: 간격의 나머지 부분

  • 암호




    class Solution {
        public:
        vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
            int n = intervals.size();
            vector<vector<int>> res;
            int idx = 0;
            while (idx < n && intervals[idx][1] < newInterval[0]) res.push_back(intervals[idx++]);
    
            if (idx < n) {
                newInterval[0] = min(intervals[idx][0], newInterval[0]);
                while (idx < n && intervals[idx][0] <= newInterval[1])
                    newInterval[1] = max(intervals[idx++][1], newInterval[1]);
            }
            res.push_back(newInterval);
            while (idx < n) res.push_back(intervals[idx++]);
    
            return res;
        }
    };
    


    복잡성


  • 시간: O(n)
  • 스페이스: O(n)
  • 좋은 웹페이지 즐겨찾기