logseq_notes/pages/OJ notes/pages/Leetcode Merge-Intervals.md
2023-06-14 14:27:22 +08:00

1.9 KiB

Leetcode Merge-Intervals

id:: 642edfd5-4367-495d-b836-510b0deaa3bf

2022-09-01 14:04

Algorithms:

#algorithm #sort

Data structures:

#DS #array

Difficulty:

#coding_problems #difficulty_medium

Additional tags:

#leetcode

Revisions:

N/A

Problem

Given an array of intervals where intervals[i] = [starti, endi], merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input.

  • Examples

  • **Example 1:**
    
    **Input:** intervals = [[1,3],[2,6],[8,10],[15,18]]
    **Output:** [[1,6],[8,10],[15,18]]
    **Explanation:** Since intervals [1,3] and [2,6] overlap, merge them into [1,6].
    
    **Example 2:**
    
    **Input:** intervals = [[1,4],[4,5]]
    **Output:** [[1,5]]
    **Explanation:** Intervals [1,4] and [4,5] are considered overlapping.
    

Constraints

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

Thoughts

[!summary] This is a generic array problem.

Situations to consider:

  • The intervals can be unordered

  • The first interval

  • [0, 3] [0, 1] are adjacent and overlapped.

    To solve the situations, sort first, and use max function to solve the 3rd solution.

  • Solution

    class Solution {
    public:
      vector<vector<int>> merge(vector<vector<int>> &intervals) {
        // sort first, so that data are continious
        vector<vector<int>> ans;
    
        sort(intervals.begin(), intervals.end());
    
        for (auto interval : intervals) {
          if (ans.empty() || ans.back()[1] < interval[0]) {
            ans.push_back(interval);
          } else {
            ans.back()[1] = max(interval[1], ans.back()[1]);
          }
        }
    
        return ans;
      }
    };