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

embedded/2024/11/25 8:07:05/

目录

题目描述

解题思路

【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.ppmy.cn/embedded/140333.html

相关文章

Vscode进行Java开发环境搭建

Vscode进行Java开发环境搭建 搭建Java开发环境(Windows)1.Jdk安装2.VsCode安装3.Java插件4.安装 Spring 插件5.安装 Mybatis 插件5.安装Maven环境6.Jrebel插件7.IntelliJ IDEA Keybindings8. 收尾 VS Code&#xff08;Visual Studio Code&#xff09;是由微软开发的一款免费、开…

STM32完全学习——使用标准库完成PWM输出

一、TIM2初始化 我这里使用的是STM32F407ZGT6这个芯片&#xff0c;我这里使用的是定时器TIM2来完成PWM输出&#xff0c;由于这里没有使用中断&#xff0c;因此不需要初始化NVIC&#xff0c;下面先来进行定时器的相关初始化 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;R…

C#的数据类型总结:decimal ,double,float的区别

在 C# 中&#xff0c;decimal、double 和 float 都是用于表示数值类型的关键字&#xff0c;但它们在精度、范围和用途上有所不同。以下是它们的主要区别和适用场景的总结。 目录 1. decimal 2. double 3. float 主要比较 适用场景总结 注意点 1. decimal 类型大小: 16 字…

解释 Python 中的可变与不可变数据类型?

在 Python 中&#xff0c;数据类型分为可变&#xff08;mutable&#xff09;和不可变&#xff08;immutable&#xff09;两种。 理解这两种类型的区别对于编写高效、可靠的代码至关重要。 作为面试官&#xff0c;我会详细解释这两者的区别&#xff0c;并提供一些实际开发中的…

一文读懂 ESLint配置

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner &#x1f339; 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我…

正则表达式灾难:重新认识“KISS原则”的意义

大家好&#xff0c;这里是hikktn&#xff01; 最近&#xff0c;我在重读经典名著《The Art of Unix Programming》&#xff0c;又一次被那句广为人知的“KISS”原则&#xff08;Keep It Simple, Stupid&#xff09;吸引。这句计算机领域的金科玉律&#xff0c;很多人只停留在字…

AwsCredentialsProvider认证接口

一、介绍 1、简介 AwsCredentialsProvider 是 AWS SDK 中用于提供 AWS 身份验证凭证的一个接口。AWS SDK 中涉及身份验证和授权的操作都需要用到凭证,而 AwsCredentialsProvider 作为一种抽象,负责提供这些凭证。AwsCredentialsProvider 在 Java SDK 中尤为重要,它可以用于…

【网络安全设备系列】3、IPS(入侵防御系统)

0x00 定义&#xff1a; 入侵防御系统是一部能够监视网络或网络设备的网络资料传输行为的计算机网络安全设备&#xff0c;能够即时的中断、调整或隔离一些不正常或是具有伤害性的网络资料传输行为。 0x01 产生背景 &#xff1a; 1、串行部署的防火墙可以拦截低层攻击行为&a…