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

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

        最近在抽时间写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) {// 滑动窗口实现NBint 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 d4  10  15    24  260  9   12  205       18 22     30*/

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【原创】edge-tts与基于mpv的edge-playback,使命令行和Python的Text To Speech唾手可得
  • 学习计算机网络
  • Flowable学习笔记
  • NISP 一级 —— 考证笔记合集
  • ISO26262和Aspice之间的关联
  • TulingMember进销存系统
  • 2409atl,atl3.0到7.0的变化
  • 828华为云征文|Flexus云服务器X实例快速部署在线测评平台,适用各种信息学教学
  • EvoSuite使用总结
  • 【重学 MySQL】十四、显示表结构
  • git的简单学习
  • Node.js 入门:中间件与安全性深度解析
  • 项目9-网页聊天室9(测试报告)
  • scrapy 爬取微博(一)【最新超详细解析】:创建微博爬取工程
  • 华为 HCIP-Datacom H12-821 题库 (4)
  • python3.6+scrapy+mysql 爬虫实战
  • CEF与代理
  • FastReport在线报表设计器工作原理
  • Linux下的乱码问题
  • PaddlePaddle-GitHub的正确打开姿势
  • passportjs 源码分析
  • python 装饰器(一)
  • SegmentFault 2015 Top Rank
  • 码农张的Bug人生 - 初来乍到
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 删除表内多余的重复数据
  • 实习面试笔记
  • 实现菜单下拉伸展折叠效果demo
  • 正则表达式小结
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 湖北分布式智能数据采集方法有哪些?
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​水经微图Web1.5.0版即将上线
  • ### RabbitMQ五种工作模式:
  • #define 用法
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • ${ }的特别功能
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (二)c52学习之旅-简单了解单片机
  • (附源码)ssm码农论坛 毕业设计 231126
  • (七)Activiti-modeler中文支持
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (十三)Flask之特殊装饰器详解
  • (新)网络工程师考点串讲与真题详解
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • ****Linux下Mysql的安装和配置
  • .Net Core 生成管理员权限的应用程序
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...