滑动窗口——632. 最小区间

news2025/1/9 1:06:40

        最近在抽时间写LC上的一个专栏——2024春招冲刺百题计划。挑着做,做了几道和滑动窗口相关的题目,632. 最小区间,LC上标记为困难,第一次写完全没有思考,参考了别人写的答案茅塞顿开,特此记录以鞭策自己学习。最近实习结束回到学校后,一边搞科研,自己本来想一天写一篇博客,以此鞭策自己学习,但自己研究方向和后端丝毫不沾边,自己最近又没有学习新的知识用以记录博客,也甚是悔已。人生如是,时常悔已。

题目简介

        632. 最小区间

题目分析

        第一眼看到这个题目让我感到非常陌生,此前并没有遇到过此种类型的题目,想了一会写了一种非常简单的实现,特别离谱就不写出来了。记录一下别人的做法,仅供加深学习印象。

        题目要的是找到一个最小的区间,对于这个区间的要求就是必须包含每个区间的至少一个元素。可以将区间个数作为限制条件,一共cnt = nums.size()个区间,这个个数作为滑动窗口的限制条件。【与此前的滑动窗口限制条件均为区间不同,应该加以变通】

        如何实现上面的区间个数作为滑动窗口的限制条件呢?大佬们提供了一种异常简洁的做法,将原本的二维List转换为一个二维数组arrs,对于二维数组中的每一个元素 arrs[i][0] 表示对应的元素值,arr[i][1] 表示对应的元素值属于原本的二维List的第几个list集合。通过转换将二维List完美转换为了数组。

        构建arrs数组后对数组按照元素值进行升序排序。排序是否必须的,只有通过排序才能够使得元素值由小到大排列,相近大小元素位置相近,此时才符合题目找出最小区间的约束。

        随后以区间个数作为滑动窗口限制条件,当窗口内的区间个数满足条件后,不断缩小左边界,以寻得符合条件的最小区间。

        具体见代码实现,已经注释过的。

代码编写

class Solution {
    public int[] smallestRange(List<List<Integer>> nums) {
        // 滑动窗口实现NB
        int total = 0;
        for(List<Integer> num : nums){
            total += num.size();
        }
        // 创建二维数组存储, arr[i][0]代表第i个元素的值,arr[i][1]代表第i个元素原先位于的组
        int[][] arr = new int[total][2];
        int i = 0, j = 0;
        for(List<Integer> num : nums){
            for(int nm : num){
                arr[i][0] = nm;
                arr[i][1] = j;
                ++i;
            }
            ++j;
        }
        // 对创建的二维数组排序
        Arrays.sort(arr, (o1, o2)-> o1[0] - o2[0]);
        // 创建返回的数组
        int[] ans = new int[2];
        // 创建数组记录每组中的元素出现的次数
        int[] count = new int[nums.size()];
        for(int l = 0, r = 0, k = 0; r < total; r++){
            if(0 == count[arr[r][1]]++){
                ++k;
            }
            if(k == nums.size()){
                while(count[arr[l][1]] > 1){
                    count[arr[l++][1]]--;
                }
                if((ans[0] == 0 && ans[1] == 0) || ans[1] - ans[0] > arr[r][0] - arr[l][0]){
                    ans[0] = arr[l][0];
                    ans[1] = arr[r][0];
                }
            }
        }
        return ans;
    }
}
/*
a b c d
  4  10  15    24  26
 0  9   12  20
   5       18 22     30
 */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2112888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android perfetto 简介

Android perfetto 简介 使用 perfetto 工具&#xff0c;您可以通过 Android 调试桥 (adb) 在 Android 设备上收集性能信息。使用 adb shell perfetto ... 命令调用 perfetto 工具。 perfetto 从您的设备上收集性能跟踪数据时会使用多种来源&#xff0c;例如&#xff1a; 使用…

5、const修饰类型和变量

const修饰类型和变量 一、const常量一些注意点1、声明时必须同时初始化2、不可更改3、与宏常量的区别 二、const修饰指针1、常量指针constant pointer2、常指向指针pointer-to-constant pointer 一、const常量一些注意点 1、声明时必须同时初始化 #include <iostream> …

框架template初识

框架初识 框架就是一个别人帮我们搭好的舞台&#xff0c;造好了很多现成的工具供我们使用&#xff0c;让开发过程更快速、简洁。 Gin框架介绍 Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 Gin是一个用Go语言编写的web框架。它是一个类似于martini 但拥有更好性能的API…

企业网银登录提示请确认您已插入工商银行U盾证书的解决方法

昨天受人之托帮小企业财务解决上网银的问题 因为不是专业做这个的&#xff0c;所以只能安装“常识”行事&#xff0c;但结果实在是令人意想不到。 排错的步骤&#xff1a; 同一台电脑上尝试不同浏览器&#xff0c;发现360浏览器的接受度相当普遍&#xff1b;给U盾换不同的连接…

抖音引流脚本工具,实现自动化引流,解放大家双手

抖音引流脚本工具,实现自动化引流,解放大家双手 #获客引流 推荐阅读&#xff1a; 百收网SEO引流脚本软件不断更新&#xff08;推广全集教程&#xff09;https://www.bsw80.com/post/460.html 我们这篇文章的话&#xff0c;来去给大家说一下这个抖音这个同城评论&#xff0c;…

探索 RAD:5 个最佳实践案例解析

天下武功&#xff0c;唯快不破&#xff01;应用开发&#xff0c;唯速称王&#xff01; 在当今快速发展的科技环境中&#xff0c;企业面临的挑战不断升级。传统的应用开发方法往往因其复杂的流程和较长的开发周期而无法满足快速变化的市场需求。在这种背景下&#xff0c;快速应…

【阿里云】个人认证与公司认证

个人认证和企业认证的区别 更新时间&#xff1a;2024-05-20 09:32:52 本文档主要介绍个人认证账号和企业认证账号的区别。 账号实名认证分为个人实名认证和企业实名认证。 个人账号认证&#xff0c;请选择认证类型为 个人&#xff0c;支持个人支付宝授权认证和个人扫脸认证。…

如何免费将视频转换为 MP4?将视频转换为 MP4 的 5 种方法

您知道如何免费将不受支持的视频格式转换为 MP4 吗&#xff1f; 您可以轻松地在视频共享网站和社交应用上访问各种视频。从网站下载视频但无法使用媒体播放器播放是很常见的事。如何将视频转换为 MP4以便更好地播放&#xff1f; 事实上&#xff0c;市场上有很多视频音频转换工…

【Python 千题 —— 算法篇】字符统计

Python 千题持续更新中 …… 脑图地址 &#x1f449;&#xff1a;⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 在编程中&#xff0c;对字符串的字符统计是一个常见任务。这在文本处理、数据分析、词频统计、自然语言处理等领域有广泛应用。无论…

PS插件DR5至臻高级版下载安装教程Photoshop美颜美白牙齿磨皮使用插件百度网盘分享

DR5至臻高级版PS插件DR5至臻高级版下载安装教程Photoshop美颜美白牙齿磨皮使用插件百度网盘分享链接地址可以对眼睛、眉毛、嘴唇等五官进行精细调整&#xff0c;如增强眼睛的明亮度和清晰度&#xff0c;使眉毛更加立体&#xff0c;嘴唇更加饱满可以快速有效地去除人像照片中的瑕…

使用 EMQX 开源版的 Webhook 机制处理消息并存储数据

1、前言 EMQX 是一款强大的开源 MQTT 消息代理&#xff0c;它支持大量的连接和高吞吐量&#xff0c;适用于各种物联网应用。Webhook 是 EMQX 提供的扩展功能之一&#xff0c;用于将消息推送到外部的 HTTP 服务。在本文中&#xff0c;我们将介绍如何使用 EMQX 开源版的 Webhook …

RabbitMQ 03 在项目中的实际使用: 告警,批处理

01.例子&#xff0c;解耦合&#xff08;使用异步&#xff09; 1.1异步思想&#xff1a;不会专门等待 1.2 例子&#xff1a;程序执行 1.3 如何设计程序 多线程&#xff1a; 订单请求模块只用于发送请求和处理确认&#xff0c;订单处理模块专门用于处理请求并且发送确认信…

金税四期工程运维:税务领域的信息化挑战与策略

在信息化浪潮的推动下&#xff0c;中国税务系统迎来了“金税四期”工程这一重大变革。作为税务信息化的新阶段&#xff0c;金税四期不仅标志着税务管理向更高效、更智能的方向迈进&#xff0c;同时也对运维工作提出了前所未有的挑战。本文将从金税四期的背景、运维需求分析、面…

101.对称二叉树

&#xff08;写给未来遗忘的自己&#xff09; 题目&#xff1a; 代码&#xff08;层次递归&#xff1a;&#xff09;&#xff1a; class Solution { public:bool isSymmetric(TreeNode* root) {std::queue<TreeNode*>lefttoright;std::queue<TreeNode*>righttol…

CSP-J基础之进制转换

文章目录 前言数制1. **二进制 (Binary)**2. **八进制 (Octal)**3. **十进制 (Decimal)**4. **十六进制 (Hexadecimal)** K进制转十进制例子 1&#xff1a;以二进制&#xff08;K 2&#xff09;为基数例子 2&#xff1a;以八进制&#xff08;K 8&#xff09;为基数例子 3&…

【MATLAB源码-第160期】基于matlab的胡桃夹子优化算法(NOA)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 胡桃夹子优化算法&#xff08;Nutcracker Optimization Algorithm, NOA&#xff09;是一个灵感来源于胡桃夹子的故事的元启发式优化算法。这个故事中&#xff0c;胡桃夹子是一个能够将坚果壳轻易地破开以获取内部果仁的工具。…

滚珠花键助力生产加工精准化!

滚珠花键是一种机械传动元件&#xff0c;它通过花键轴与花键孔的配合&#xff0c;将动力从一个轴传递到另一个。在工业自动化领域内&#xff0c;滚珠花键系列产品主要用于辅助直线运动。尤其是在那些需要精密传动的应用场景&#xff0c;而滚珠花键在生产加工中的优势主要体现在…

Vulnhub:Dr4g0n b4ll 1

靶机下载地址 信息收集 主机发现 nmap扫描攻击机同网段存活主机。 nmap 192.168.31.0/24 -Pn -T4 靶机ip&#xff1a;192.168.31.183 端口扫描 nmap 192.168.31.183 -A -p- -T4 开放了22,80端口&#xff0c;端口详细信息如下&#xff1a; 网站信息收集 访问http服务。 …

WPF入门到跪下 第十一章 Prism(四)View与ViewModel的自动关联

View与ViewModel的自动关联 一、ViewModelLocator 在学习MvvmLight框架时&#xff0c;也使用了ViewModelLocator类。但在MvvmLight框架中&#xff0c;ViewModelLocator只是一个自定义类&#xff0c;与框架无关&#xff0c;目的就是初始化IOC容器。而在Prism框架中则不同&…

matplotlib中文乱码问题

在使用Matplotlib进行数据可视化的过程中&#xff0c;经常会遇到中文乱码的问题。显示乱码是由于编码问题导致的&#xff0c;而matplotlib 默认使用ASCII 编码&#xff0c;但是当使用pyplot时&#xff0c;是支持unicode编码的&#xff0c;只是默认字体是英文字体&#xff0c;导…