面试算法57:值和下标之差都在给定的范围内

题目

给定一个整数数组nums和两个正数k、t,请判断是否存在两个不同的下标i和j满足i和j之差的绝对值不大于给定的k,并且两个数值nums[i]和nums[j]的差的绝对值不大于给定的t。
例如,如果输入数组{1,2,3,1},k为3,t为0,由于下标0和下标3对应的数字之差的绝对值为0,因此返回true。如果输入数组{1,5,9,1,5,9},k为2,t为3,由于不存在两个下标之差小于或等于2且它们差的绝对值小于或等于3的数字,因此此时应该返回false。

分析1

首先考虑最直观的解法。可以逐一扫描数组中的每个数字。对于每个数字nums[i],需要逐一检查在它前面的k个数字是否存在从nums[i]-t到nums[i]+t的范围内的数字。如果存在,则返回true。这种思路很容易用两个嵌套的循环实现。由于数组中的每个数字都要和k个数字进行比较,如果数组的长度为n,那么这种解法的时间复杂度是O(nk)。
接下来尝试优化时间复杂度。逐一扫描数组中的每个数字。对于每个数字nums[i],应该先从它前面的k个数字中找出小于或等于nums[i]的最大的数字,如果这个数字与nums[i]的差的绝对值不大于t,那么就找到了一组符合条件的两个数字。否则,再从它前面的k个数字中找出大于或等于nums[i]的最小的数字,如果这个数字与nums[i]的差的绝对值不大于t,就找到了一组符合条件的两个数字。
需要从一个大小为k的数据容器中找出小于或等于某个数字的最大值及大于或等于某个数字的最小值,这正是TreeSet或TreeMap适用的场景。因为这个容器只需要保存数字,所以可以用TreeSet来保存每个数字nums[i]前面的k个数字。

解1

public class Test {public static void main(String[] args) {int[] nums = {1, 2, 3, 1};boolean result = containsNearbyAlmostDuplicate(nums, 3, 0);System.out.println(result);}public static boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {TreeSet<Long> set = new TreeSet<>();for (int i = 0; i < nums.length; i++) {// 地板:返回键小于或等于给定值的最大值,如果没有则返回nullLong lower = set.floor((long)nums[i]);if (lower != null && lower >= (long)nums[i] - t) {return true;}// 天花板:返回大于或等于给定值的最小值,如果没有则返回nullLong upper = set.ceiling((long)nums[i]);if (upper != null && upper <= (long)nums[i] + t) {return true;}set.add((long)nums[i]);if (i >= k) {set.remove((long)nums[i - k]);}}return false;}
}

分析2

下面换一种思路来解决这个问题。由于这个题目关心的是差的绝对值小于或等于t的数字,因此可以将数字放入若干大小为t+1的桶中。例如,将从0到t的数字放入编号为0的桶中,从t+1到2t+1的数字放入编号为1的桶中。其他数字以此类推。这样做的好处是如果两个数字被放入同一个桶中,那么它们的差的绝对值一定小于或等于t。
还是逐一扫描数组中的数字。如果当前扫描到数字num,那么它将放入编号为id的桶中。如果这个桶中之前已经有数字,那么就找到两个差的绝对值小于或等于t的数字。如果桶中之前没有数字,则再判断编号为id-1和id-2的这两个相邻的桶中是否存在与num的差的绝对值小于或等于t的数字。因为其他桶中的数字与num的差的绝对值一定大于t,所以不需要判断其他的桶中是否有符合条件的数字。

解2

public class Test {public static void main(String[] args) {int[] nums = {1, 2, 3, 1};boolean result = containsNearbyAlmostDuplicate(nums, 3, 0);System.out.println(result);}public static boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {Map<Integer, Integer> buckets = new HashMap<>();int bucketSize = t + 1;for (int i = 0; i < nums.length; i++) {int num = nums[i];int id = getBucketID(num, bucketSize);if (buckets.containsKey(id)|| (buckets.containsKey(id - 1) && buckets.get(id - 1) + t >= num)|| (buckets.containsKey(id + 1) && buckets.get(id + 1) - t <= num)) {return true;}buckets.put(id, num);if (i >= k) {buckets.remove(getBucketID(nums[i - k], bucketSize));}}return false;}private static int getBucketID(int num, int bucketSize) {return num >= 0 ? num / bucketSize : (num + 1) / bucketSize - 1;}
}

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

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

相关文章

Java版直播商城规划:电商源码、小程序、三级分销与免 费搭建全攻略

【saas云平台】打造全行业全渠道全场景的saas产品&#xff0c;为经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营场景…

在Next.js渲染Markdown竟然如此简单

Next.js 作为一款开箱即用的 React 框架&#xff0c;因其优秀的服务器渲染能力和灵活的配置方式&#xff0c;已经吸引了大量的开发者。同时&#xff0c;Markdown 作为一种轻量级的标记语言&#xff0c;以其简洁的语法和强大的功能&#xff0c;已经成为了写作的首选工具。那么&a…

51单片机4线并发IO口控制1602LCD

51单片机4线并发IO口控制1602LCD 1.概述 这篇文章介绍单片机使用4个并发IO口数据线控制LCD显示字符&#xff0c;为单片机节省了4个IO口。 单片机4个IO口控制LCD原理就是将原来1个字节8位数据拆分2次读写&#xff0c;首先读取高4位数据&#xff0c;然后再读低4位数据&#xff…

centos7.9源码编译rtpproxy2.2

升级到gcc9&#xff0c;不然make会报错 yum install centos-release-scl -y yum install devtoolset-9 -y #临时覆盖系统原有的gcc引用 scl enable devtoolset-9 bash # 查看gcc版本 gcc -v 下载和编译rtpproxy cd /usr/src git clone -b rtpp-2.2 https://github.com/sippy/rt…

DDD架构实践

ddd架构浅析 背景介绍 什么是ddd架构&#xff0c;是以ddd思想为参考&#xff0c;做出一份符合ddd思想的框架。 随着技术的迭代升级&#xff0c;越来越多的瓶颈暴露出来&#xff0c;性能瓶颈&#xff0c;系统复杂度瓶颈&#xff0c;这些都逐一被迭代出的技术产物解决。最终的…

SE-Net:Squeeze-and-Excitation Networks(CVPR2018)

文章目录 AbstractIntroduction表征的重要性以前的方向本文提出 Related WorkDeeper ArchitectureAlgorithmic Architecture SearchAttention and gating mechanisms Squeeze-and-Excitation BlocksSqueeze: Global Information EmbeddingExcitation: Adaptive RecalibrationIn…

Python的魔术方法

什么是魔术方法 魔法方法(Magic Method)是python内置方法&#xff0c;格式为&#xff1a;“方法名”&#xff0c;不需要主动调用&#xff0c;存在的目的是为了给python的解释器进行调用&#xff0c;几乎每个魔法方法都有一个对应的内置函数&#xff0c;或者运算符&#xff0c;…

高中信息技术教资科目三

第一章-课程理论知识 学科核心素养 信息意识计算思维数字化学习与创新信息社会责任 教学环节 新课导入新课讲授巩固提高小结作业 第二章-教学实施类 第一节-新课导入 导入原则 针对性原则趣味性原则简洁性原则启发性原则 导入方法 开门见山温故知新生活情境作品情境活…

2023长三角(芜湖)人工智能数字生态峰会成功召开!

聚焦当下&#xff0c;共议数字时代发展&#xff1b;瞩目未来&#xff0c;共谋数字生态蓝图。12月11日&#xff0c;2023长三角&#xff08;芜湖&#xff09;人工智能数字生态峰会暨2023长三角&#xff08;芜湖&#xff09;人工智能视觉算法大赛颁奖典礼在芜湖宜居国际博览中心盛…

如何使用AnyTXT Searcher实现远程办公速查异地电脑文件提升工作效率

如何使用AnyTXT Searcher实现远程办公速查异地电脑文件提升工作效率 前言1. AnyTXT Searcher1.1 下载安装AnyTXT Searcher 2. 下载安装注册cpolar3. AnyTXT Searcher设置和操作3.1 AnyTXT结合cpolar—公网访问搜索神器3.2 公网访问测试 4. 固定连接公网地址 前言 你是否遇到过…

飞速(FS)100G ZR4 光模块80km长距离传输

如今&#xff0c;100G QSFP28光模块已经被广泛部署在100m到40km的范围内。然而&#xff0c;传统的100G QSFP28模块面临一个挑战&#xff0c;因为它们的设计仅限于不超过40km的距离。超出此范围&#xff0c;色散、光衰减等问题就会增加&#xff0c;导致信噪比&#xff08;SNR&am…

八股文打卡day3——计算机网络(3)

面试题&#xff1a;请讲一下四次挥手的过程&#xff1f; 1.客户端发送FIN数据包给服务器&#xff0c;表示客户端不再发送数据给服务器&#xff0c;想要断开这个方向的连接。 2.服务器收到客户端的FIN包之后&#xff0c;发送ACK包给客户端&#xff0c;对收到的FIN包进行收到确认…

Vue3 Element Plus WindiCSS 项目开发环境搭建

一 概述 MVVM 是 Model-View-ViewModel 的简写&#xff0c;它本质上是 MVC 的改进版。MVVM 将其中的 View 的状态和行为抽象化&#xff0c;并且将视图 UI 和业务逻辑分开。 &#xff08;1&#xff09;M&#xff1a;即 Model&#xff08;模型&#xff09;&#xff0c;包括数据和…

13. 从零用Rust编写正反向代理, HTTP中的压缩gzip,deflate,brotli算法

wmproxy wmproxy是由Rust编写&#xff0c;已实现http/https代理&#xff0c;socks5代理&#xff0c; 反向代理&#xff0c;静态文件服务器&#xff0c;内网穿透&#xff0c;配置热更新等&#xff0c; 后续将实现websocket代理等&#xff0c;同时会将实现过程分享出来&#xff…

mysql的索引约束检查触发器

索引&#xff1a; MySQL 索引是一种用于提高查询性能的关键数据库特性。通过在表上创建索引&#xff0c;MySQL 可以更有效地定位和检索数据&#xff0c;从而加速查询操作。以下是关于 MySQL 索引的一些基本信息&#xff1a; 1. **索引类型&#xff1a;** - **单列索引&…

构建智慧储能物联网,4G工业路由器远程监测在线管理

物联网技术的发展为智慧储能管理带来了革命性的变化。其中&#xff0c;4G工业路由器IR5000通过丰富的连接能力如串口RS485/232或网口的方式&#xff0c;实现了与储能现场各设备的连接&#xff0c;包括电表、电能检测器、防孤岛装置、BMS电池管理系统、监控服务器、储能控制器、…

WEB渗透—PHP反序列化(五)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

xcrun: error: invalid active developer path

macOS升级完成后出现 xcrun: error: invalid active developer path问题。 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun这是由于 Xcode command line tools 丢…

Python-Selenium-使用 pywinauto 实现 Input 上传文件

当前环境&#xff1a;Win10 Python3.7 pywinauto0.6.8&#xff0c;selenium3.14.1 示例代码 from pywinauto import Desktop import osapp Desktop() dialog app[打开] dialog[Edit].set_edit_text(os.getcwd() .\\example-01.jpg) dialog[Button].click() 其他方法&…

LINUX SD卡备份的镜像+烧录启动时自动扩展最后一个分区

在开发到生产过程中,对系统镜像的备份及再烧录过程是必不可少的。经常看到烧录官方镜像的时候,我们会发现当镜像第一次启动后,磁盘空间会自动扩充到整个TF/SD卡。那么当我们自己制作镜像的时候,能不能去除未使用的空间,制作体积较小的镜像,并在该镜像启动时自动扩展,从而…