632. Smallest Range Covering Elements from K Lists

You have k lists of sorted integers in non-decreasing order. Find the smallest range that includes at least one number from each of the k lists.

We define the range [a, b] is smaller than range [c, d] if b - a < d - c or a < c if b - a == d - c.

 

Example 1:

Input: nums = [[4,10,15,24,26],[0,9,12,20],[5,18,22,30]]
Output: [20,24]
Explanation: 
List 1: [4, 10, 15, 24,26], 24 is in range [20,24].
List 2: [0, 9, 12, 20], 20 is in range [20,24].
List 3: [5, 18, 22, 30], 22 is in range [20,24].

Example 2:

Input: nums = [[1,2,3],[1,2,3],[1,2,3]]
Output: [1,1]

Example 3:

Input: nums = [[10,10],[11,11]]
Output: [10,11]

Example 4:

Input: nums = [[10],[11]]
Output: [10,11]

Example 5:

Input: nums = [[1],[2],[3],[4],[5],[6],[7]]
Output: [1,7]

 

Constraints:

  • nums.length == k
  • 1 <= k <= 3500
  • 1 <= nums[i].length <= 50
  • -105 <= nums[i][j] <= 105
  • nums[i] is sorted in non-decreasing order.

Rust Solution

struct Solution;

use std::cmp::Reverse;
use std::collections::BinaryHeap;

impl Solution {
    fn smallest_range(nums: Vec<Vec<i32>>) -> Vec<i32> {
        let n = nums.len();
        let mut queue: BinaryHeap<(Reverse<i32>, usize, usize)> = BinaryHeap::new();
        let mut left = std::i32::MAX;
        let mut right = std::i32::MIN;
        for i in 0..n {
            let x = nums[i][0];
            left = left.min(x);
            right = right.max(x);
            queue.push((Reverse(x), i, 1));
        }
        let mut min = (right - left, (left, right));
        while let Some((Reverse(_), i, j)) = queue.pop() {
            if j == nums[i].len() {
                break;
            } else {
                let x = nums[i][j];
                right = right.max(x);
                queue.push((Reverse(x), i, j + 1));
                if let Some(&(Reverse(y), _, _)) = queue.peek() {
                    left = left.max(y);
                }
                let r = (right - left, (left, right));
                if r < min {
                    min = r;
                }
            }
        }
        vec![(min.1).0, (min.1).1]
    }
}

#[test]
fn test() {
    let nums = vec_vec_i32![[4, 10, 15, 24, 26], [0, 9, 12, 20], [5, 18, 22, 30]];
    let res = vec![20, 24];
    assert_eq!(Solution::smallest_range(nums), res);
}

Having problems with this solution? Click here to submit an issue on github.