56. Merge Intervals Medium

@problem@discussion
#Array#Sorting



1/**
2 * [56] Merge Intervals
3 *
4 * 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.
5 *  
6 * Example 1:
7 *
8 * Input: intervals = [[1,3],[2,6],[8,10],[15,18]]
9 * Output: [[1,6],[8,10],[15,18]]
10 * Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
11 *
12 * Example 2:
13 *
14 * Input: intervals = [[1,4],[4,5]]
15 * Output: [[1,5]]
16 * Explanation: Intervals [1,4] and [4,5] are considered overlapping.
17 *
18 *  
19 * Constraints:
20 *
21 * 1 <= intervals.length <= 10^4
22 * intervals[i].length == 2
23 * 0 <= starti <= endi <= 10^4
24 *
25 */
26pub struct Solution {}
27
28// problem: https://leetcode.com/problems/merge-intervals/
29// discuss: https://leetcode.com/problems/merge-intervals/discuss/?currentPage=1&orderBy=most_votes&query=
30
31// submission codes start here
32use std::cmp;
33impl Solution {
34    pub fn merge(intervals: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
35        let mut data = intervals.clone();
36        data.sort();
37        let mut result: Vec<Vec<i32>> = vec![];
38
39        for i in data {
40            match result.last() {
41                Some(l) => {
42                    let (overlap, r) = Self::overlap(&i, l);
43                    if overlap {
44                        result.pop();
45                        result.push(r);
46                    } else {
47                        result.push(i);
48                    }
49                }
50                None => {
51                    result.push(i);
52                }
53            }
54        }
55        result
56    }
57
58    fn overlap(a: &Vec<i32>, b: &Vec<i32>) -> (bool, Vec<i32>) {
59        if a[0] > b[0] {
60            return Self::overlap(b, a);
61        }
62        if a[1] >= b[0] {
63            (true, vec![a[0], cmp::max(a[1], b[1])])
64        } else {
65            (false, vec![])
66        }
67    }
68}
69
70// submission codes end
71
72#[cfg(test)]
73mod tests {
74    use super::*;
75
76    #[test]
77    fn test_56() {
78        assert_eq!(
79            Solution::merge(vec![vec![1, 3], vec![2, 6], vec![8, 10], vec![15, 18]]),
80            vec![vec![1, 6], vec![8, 10], vec![15, 18]]
81        );
82    }
83}
84


Back
© 2025 bowen.ge All Rights Reserved.