当前位置: 首页 > article >正文

LeetCode-632. Smallest Range Covering Elements from K Lists [C++][Java]

目录

题目描述

解题思路

【C++】

【Java】


LeetCode-632. Smallest Range Covering Elements from K Listsicon-default.png?t=O83Ahttps://leetcode.com/problems/smallest-range-covering-elements-from-k-lists/description/

题目描述

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]

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.

解题思路

【C++】

class Solution {
public:
    vector<int> smallestRange(vector<vector<int>>& nums) {
        int n = nums.size(), xmin = INT_MAX, xmax = INT_MIN;
        unordered_map<int, vector<int>> indices;
        for (int i = 0; i < n; i++) {
            for (const int& num : nums[i]) {
                indices[num].push_back(i);
                xmin = min(xmin, num);
                xmax = max(xmax, num);
            }
        }
        vector<int> freq(n);
        int in = 0, l = xmin, r = xmin - 1, ansL = xmin, ansR = xmax;
        while (r < xmax) {
            if (!indices.count(++r)) {continue;}
            for (const int& i : indices[r]) {
                ++freq[i];
                if (freq[i] == 1) {++in;}
            }
            while (in == n) {
                if (r - l < ansR - ansL) {
                    ansR = r;
                    ansL = l;
                }
                if (indices.count(l)) {
                    for (const int& i : indices[l]) {
                        --freq[i];
                        if (freq[i] == 0) {--in;}
                    }
                }
                ++l;
            }
        }
        return {ansL, ansR};
    }
};

【Java】

class Solution {
    public int[] smallestRange(List<List<Integer>> nums) {
        int n = nums.size(), xmin = Integer.MAX_VALUE, xmax = Integer.MIN_VALUE;
        Map<Integer, List<Integer>> indices = new HashMap<Integer, List<Integer>>();
        for (int i = 0; i < n; i++) {
            for (int num : nums.get(i)) {
                List list = indices.getOrDefault(num, new ArrayList<Integer>());
                list.add(i);
                indices.put(num, list);
                xmin = Math.min(xmin, num);
                xmax = Math.max(xmax, num);
            }
        }
        int[] freq = new int[n];
        int in = 0, l = xmin, r = xmin - 1, ansL = xmin, ansR = xmax;
        while (r < xmax) {
            if (!indices.containsKey(++r)) {continue;}
            for (int i : indices.get(r)) {
                ++freq[i];
                if (freq[i] == 1) {++in;}
            }
            while (in == n) {
                if (r - l < ansR - ansL) {
                    ansR = r;
                    ansL = l;
                }
                if (indices.containsKey(l)) {
                    for (int i : indices.get(l)) {
                        --freq[i];
                        if (freq[i] == 0) {--in;}
                    }
                }
                ++l;
            }
        }
        return new int[]{ansL, ansR};
    }
}

复杂度分析

时间复杂度:O(nk+∣V∣),其中 n 是所有列表的平均长度,k 是列表数量,∣V∣ 是列表中元素的值域,在本题中 ∣V∣≤2∗10^5。构造哈希映射的时间复杂度为 O(nk),双指针的移动范围为 ∣V∣,在此过程中会对哈希映射再进行一次遍历,时间复杂度为 O(nk),因此总时间复杂度为 O(nk+∣V∣)。

空间复杂度:O(nk),即为哈希映射使用的空间。哈希映射的「键」的数量由列表中的元素个数 nk 以及值域 ∣V∣ 中的较小值决定,「值」为长度不固定的数组,但是它们的长度之和为 nk,因此哈希映射使用的空间为 O(nk)。在使用双指针时,还需要一个长度为 n 的数组,其对应的空间在渐进意义下小于 O(nk),因此可以忽略。


http://www.kler.cn/a/408495.html

相关文章:

  • 【食品包装原纸】市场未来几年行业竞争将更加激烈,尤其在中国市场
  • 测试实项中的偶必现难测bug之模糊匹配逻辑
  • docker容器化部署springboot项目
  • 【Ubuntu24.04】服务部署(Docker)
  • 企业OA管理系统:Spring Boot技术实现与案例研究
  • 使用 helm 部署 gitlab
  • vue--制作购物车
  • 【2024最新】基于Springboot+Vue的智慧食堂系统Lw+PPT
  • Spring Boot应用开发深度解析与实践案例
  • 基于lora的llama2二次预训练
  • 深入解析自校正控制(STC)算法及python实现
  • Python自动化测试实践中pytest用到的功能dependency和parametrize
  • Ansible--自动化运维工具
  • package.json中^1.x.x、~1.x.x、1.x.x有什么区别
  • 性能优化--CPU微架构
  • 单元测试入门
  • CTFHUB--yeeclass-web
  • msf的渗透流程
  • 初始背单词的方法:论冲泡一杯茶水来喝
  • C#里怎么样实现操作符重载?
  • 计算机毕业设计原创定制(免费送源码)Java+SpringBoot+MySQL SpringBoot物流配送后台系统
  • 第1章计算机系统概论
  • 基于Java Springboot高校体育运动会比赛系统
  • leetcode 排序算法汇总
  • 对sklearn库中的鸢尾花数据集内容和结构的详解认识和load_iris()函数查找学习举例
  • 瀚海微SD NAND之SD 协议(34)1.8V信号的时序