【桶】220.存在重复元素 III 【LeetCode】

220.存在重复元素 III 【LeetCode】

给你一个整数数组 nums 和两个整数 kt。请你判断是否存在 两个不同下标ij,使得 abs(nums[i] - nums[j]) <= t,同时又满足 abs(i - j) <= k

如果存在则返回 true,不存在返回 false

示例 1
输入:nums = [1,2,3,1], k = 3, t = 0
输出:true

示例 2
输入:nums = [1,0,1,1], k = 1, t = 2
输出:true

示例 3
输入:nums = [1,5,9,1,5,9], k = 2, t = 3
输出:false

提示
0<=nums.length<=2∗1040 <= nums.length <= 2 * 10^40<=nums.length<=2104
−231<=nums[i]<=231−1-2^{31} <= nums[i] <= 2^{31} - 1231<=nums[i]<=2311
0<=k<=1040 <= k <= 10^40<=k<=104
0<=t<=231−10 <= t <= 2^{31} - 10<=t<=2311

思路:由于对于一个数 xxx,只要找到存在[x−t,x+t][x-t,x+t][xt,x+t]内的数就算成功,于是采用桶的思想,桶的大小设为 t+1t+1t+1,此时桶内的极差为 ttt,即桶内的任意的两个数的差都符合条件,因此若某个桶同时出现两个及以上的元素即说明 truetruetrue,而对于数 xxx 既可向前找 ttt 个数,也可向后找 ttt 个数,因此还需观察相邻桶中的元素,相邻桶若存在与该数的差值不大于 ttttruetruetrue,而由于某桶中出现两个元素就直接成功了,因此相邻桶要么没有元素,要么只有一个元素(因此采用哈希表实现桶),因此只需比对常数级次数。而对于限制条件 kkk,只需模拟大小 k+1k+1k+1 的滑动窗口,从左到右遍历数组,每次从右端加入新的数并且删除最左端的数

官方题解

class Solution {
public:int getID(int x, long w) {return x < 0 ? (x + 1ll) / w - 1 : x / w;}bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {unordered_map<int, int> mp;int n = nums.size();for (int i = 0; i < n; i++) {long x = nums[i];int id = getID(x, t + 1ll);if (mp.count(id)) {return true;}if (mp.count(id - 1) && abs(x - mp[id - 1]) <= t) {return true;}if (mp.count(id + 1) && abs(x - mp[id + 1]) <= t) {return true;}mp[id] = x;if (i >= k) {mp.erase(getID(nums[i - k], t + 1ll));}}return false;}
};作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/contains-duplicate-iii/solution/cun-zai-zhong-fu-yuan-su-iii-by-leetcode-bbkt/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

代码解释

哈希映射函数

int getID(int x, long w) {return x < 0 ? (x + 1ll) / w - 1 : x / w;
}

在这里插入图片描述
正数部分很好理解,主要讨论负数部分

  1. 首先将负数都加1,由图可以看到加1后负数的坐标恰好与右边正数形成镜像映射,于是对称的两边的 ididid 互为相反数
  2. 为解决 +0+0+0−0-00ididid 冲突,于是将负数桶的 ididid 均减1

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

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

相关文章

远控免杀专题12--Green-Hat-Suite免杀

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

英语基础语法(八)-时态

英语中&#xff0c;动词时态的用法是尤其复杂和富于变化的。经常通过动词词尾、组动词等的变化表明动作发生时间的先后顺序&#xff0c;即时态。总的来说&#xff0c;英语中的动词时态分为 三个基本类型&#xff1a; 现在、过去和将来。动词时态的变化常常伴随着相应的表示时间…

Java PushbackInputStream markSupported()方法与示例

PushbackInputStream类markSupported()方法 (PushbackInputStream Class markSupported() method) markSupported() method is available in java.io package. markSupported()方法在java.io包中可用。 markSupported() method is used to check whether this stream supports …

面型对象 (接口与类的区别)

public class Demo4_Interface {public static void main(String[] args) {某女星 clown new 某女星();clown.潜规则();clown.关系();} }/*亲爹只有一个&#xff0c;是单继承;干爹可以有很多个&#xff0c;是多实现;*/ interface 某干爹{public void 关系();public void 潜规…

远控免杀专题 13----zirikatu免杀

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

UML 的九种模型图

1. UML的模型图 UML 的模型图能够将被建模的系统的某一个方面的某一部分以图形的方式表示出来&#xff0c;不同的视图通过将多个不同的模型图有机组合在一起就能够描述系统模型的某方面的特征。UML的模型图是有模型元素构成的&#xff0c;模型元素以图标的形式直观形象的表达…

【莫队】区间众数(Codeforces Round #716 (Div. 2) D)

D. Cut and Stick &#xff08;赛后补题&#xff09;借本题学习莫队算法以及区间众数的求法 题意&#xff1a;对于整型数组&#xff0c;每次询问[L,R][L,R][L,R]区间问最少分为多少个子序列&#xff0c;使得每个子序列的众数xxx的个数cntxcnt_xcntx​不大于 ⌈len2⌉\left \l…

如何正确使用SqlConnection

以前曾见过有人这样写代码&#xff1a; public class Service1 : IService1{private SqlConnection conn new SqlConnection();public void Method1(){//do something with conn;}public void Method2(){//do something with conn;}public void Method3(){//do something with…

关系代数基本运算_关系代数的基本和附加运算

关系代数基本运算Definition 定义 Every DBMS must define a query language to enable users to access the data which is stored in the database. Relational Algebra is a procedural query language. It is used to query the database tables in order to access data…

远控免杀专题 14 ---AVIator

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

面型对象 (包package)

面向对象(package关键字的概述及作用) 为什么要有包 将字节码(.class)进行分类存放 包其实就是文件夹 代码如下&#xff1a; package beyond.hjj;//在当前运行目录下创建一个子目录结构beyond\hjj&#xff0c;在子目录下存放已经编译成字节码文件的clown.class类。 class c…

【Web开发】级联查询(Ajax/ jQuery/ Servlet)

实现级联查询 共有两个下拉框&#xff0c;第一级为学院&#xff0c;第二级为学院开设的科目。 实现的功能为&#xff1a;当改变学院的选择&#xff0c;第二级下拉框需变为对应学院开设的科目内容。 结果预览&#xff1a; jsp页面 <% page contentType"text/html;…

asp.net treeView绑定

这个东西不是什么复杂的东西&#xff0c; 帮着小兄弟写个Demo, 实现个Binding public partial class _Default : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Bind(); } } priv…

关于TOmcat的一些小小的知识

web.xml中的url-pattern和form 表单中的action是相同的。form 表单中的action声明的并不是servlet的名字 例&#xff1a; <servlet> <servlet-name>welcome</servlet-name> <servlet-class>WelcomeYou</servlet-class> </servlet> <ser…

Java文件类字符串getAbsolutePath()方法(带示例)

文件类字符串getAbsolutePath() (File Class String getAbsolutePath()) This method is available in package java.io.File.getAbsolutePath(). 软件包java.io.File.getAbsolutePath()中提供了此方法。 This method is used to return the absolute path of the file object …

远控免杀专题(15)-DKMC免杀

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

面向对象(静态成员内部类的调用)

class beyond{public static void main(String []args){//外部类名.内部类名 对象名 外部类名.内部类对象(new 内部类名)/*Outer.Inner yy Outer.new Inner(); 类里面有个非静态方法&#xff0c;需要new创建Inner对象;正常的形式是这样的&#xff0c;但是我们习惯将new放在前…

SQL——以面向集合的思维方式来思考

本文来自&#xff1a;http://www.ituring.com.cn/article/details/472 为了以有趣的方式更好地帮助你形成面向集合的思维方式&#xff0c;我将给出自己最喜欢的游戏之一——集合。你可以在线玩这个游戏&#xff0c;网址是www.setgame.com/puzzle/set.htm&#xff0c;每天都会贴…

转载: 统计图控件NetCharting 和ZedGraph的比较

原文出处&#xff1a;http://hi.baidu.com/goga/blog/item/07b3024f61b8cd35aec3ab47.html最近考察了几个统计图表控件包&#xff0c;开源的有ZedGraph&#xff0c;Nplot等&#xff0c;但是相比之下还是ZedGraph强大&#xff0c;方便一些&#xff0c;其他的感觉还是半成品。收费…

【汇编语言】状态标志符(CF/OF/SF/ZF)在运算(ADD/SUB/ADC/SBB)过程中的响应变化

目录各类运算时状态标志的响应变化标志符在各种ADD运算下的响应情况标志符在各种SUB运算下的响应情况借助标志符实现多位数之间运算ADC(add with carry)带进位加法指令SBB(subtract with borrow)带借位减法指令各类运算时状态标志的响应变化 标志符具体含义CF&#xff08;Carr…