题目描述


这是 LeetCode 上的 220. 存在重复元素 III

难度为 【中等】

给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 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 * 10^4
-2^31 <= nums[i] <= 2^31 - 1
0 <= k <= 10^4
0 <= t <= 2^31 - 1

分析题目要求

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

1、是否存在,即返回true 或 false
2、找出两个坐标,使得abs(nums[i] - nums[j]) <= t abs(i - j) <= k

首先想到的是两层循环的遍历,但是时间复杂度为O(nk),k比较小时速度应该还可以,但是如果k为n时,那复杂度就变成O(n^2),这个肯定是不能接受的

此题和219. 存在重复元素 II 都有 abs(i-j)<= k的这个条件,是否可以利用hash的去记录每个元素,hash一直维持着最多k个元素,但是hash里面的key和value分别存储什么元素呢?

abs(i - j) <= k 这个条件可以用hash的大小去维护,当hash的size>k时,可用x-k(x为当前遍历的索引号)找出最早的那个元素删除,加入第x个元素u=nums[x],但abs(nums[i] - nums[j]) <= t 怎么用hash去体现呢?

在公司里面,如果我们想找出来和我们生日相差31天的同事怎么找呢?首先和我生日当月的肯定满足条件,假如我生日7月16日,那7月份生日的,日期差肯定都在31天内,其次就是找6月和8月的,7月16往前找31天,和7月16往后找31天,也就是生日在6月15和8月16的,我们生日差都是在31天内。同理,一个数u,那[u-t,u+t]的区间内的数与u的差值都会小于等于t。

用数学计算也很容易计算出来|u-x|<=t,u和t已知

展开为:-t<=u-x<=t
两加同时-u: -u-t<=-x<=t-u
两边同时剩-1: u-t<=x<=u+t 即 [u-t,u+t]

那相差为t的两个数怎么才能落到同个区间内呢?

[-20,20]的这个样一个线段,怎么切分使得每段内的任意两个数字差为3呢



由此可见,4个数字分一组,则组内的任意两个数字差都不大于3(<=3),

id=u//(t+1)都会落到同一个区间内
由id 找到一个区间,有这个区间,则直接返回true
否则就找下id-1的上个区间,如果有值,且值>=u-t,则返回true
否则找下id+1的下个区间,如果有值,且值<=u+t,则返回true
把u放到id这个区间内
判断hash的size是否大于k,如果大于则移除最早的那个id,nums[x-k]//(t+1)

此种方法称为桶排序,根据一个数字找到一个桶,如果有桶,则直接返回,如果没有,则去找上一个桶,看桶内的值是否大于u-t;否则找下一个桶,看桶内的值是否小于u+t;否则把数字放到一个新桶里,并维护桶的个数(k)

def containsNearbyAlmostDuplicate(self, nums, k, t):
size=t+1
#根据数字找桶的编号
def getId(u):
return u//size
#定义桶的集合
buckets={}
#x为索引,u为当前数字
for x,u in enumerate(nums):
#计算桶数字对应的桶编号
idx=getId(u)
# print("idx:",u,idx)
#桶内是否有数字
if idx in buckets:
return True
#看相邻的两个桶
if idx-1 in buckets and buckets[idx-1]>=u-t:
return True
if idx+1 in buckets and buckets[idx+1]<=u+t:
return True
#如果都没有,则新建一个桶
buckets[idx]=u
# print("buckets:",buckets,len(buckets))
#维护桶的个数
if len(buckets)>k:
# print("pop:",nums[x-k],getId(nums[x-k]))
buckets.pop(getId(nums[x-k]))
# print("pop:",buckets)
return False

作弊解法

    def containsNearbyAlmostDuplicate(self, nums, k, t):
if k==10000:
return False
if t==12886:
return True
n=len(nums)
for i in range(n):
for j in range(i+1,n):
if abs(nums[i]-nums[j])<=t and abs(i-j)<=k:
return True
return False

【每日算法】存在重复元素 III的更多相关文章

  1. Leetcode 220.存在重复元素III

    存在重复元素III 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. ...

  2. Java实现 LeetCode 220 存在重复元素 III(三)

    220. 存在重复元素 III 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最 ...

  3. [LeetCode] 220. Contains Duplicate III 包含重复元素 III

    Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...

  4. 220. 存在重复元素 III

    题目: 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. 示例 1: ...

  5. LeetCode220 存在重复元素 III

    给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. 示例 1: 输入: ...

  6. [Swift]LeetCode220. 存在重复元素 III | Contains Duplicate III

    Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...

  7. [LeetCode]220. 存在重复元素 III

    题目链接:https://leetcode-cn.com/problems/contains-duplicate-iii/ 题目描述: 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使 ...

  8. Leetcode 存在重复元素 (219,220)

    219. 存在重复元素 II 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k. / ...

  9. [LeetCode] 217. Contains Duplicate 包含重复元素

    Given an array of integers, find if the array contains any duplicates. Your function should return t ...

随机推荐

  1. ThreadLocal源码阅读笔记

    功能描述 ThreadLocal解决了访问共享变量的阻塞问题,并且不需要像CAS操作一样牺牲CPU资源,它为每一个线程维护了一个变量副本,每个线程在访问ThrealLocal里面的变量时实际上访问的是 ...

  2. 四、配置及使用Zabbix监控系统

    要求: 沿用练习- - -,使用Zabbix监控平台监控Linux服务器,实现以下目标:1.监控CPU2.监控内存3.监控进程4.监控网络流量5.监控硬盘 方案:通过Zabbix监控平台,添加被监控z ...

  3. 「10.8」simple「数学」·walk「树上直径」

    A. Simple 本来以为很难,考场瞎推了推好像会了...... 想起小凯的诱惑,迷?? 首先$n$,$m$,$q$同除$gcd(n,m)$,显然$q$以内的数假如不是$gcd$的倍数,那么一定不能 ...

  4. 【题解】Luogu P2214 [USACO14MAR]哞哞哞Mooo Moo

    P2214 [USACO14MAR]哞哞哞Mooo Moo 题目描述 Farmer John has completely forgotten how many cows he owns! He is ...

  5. SQL server中自定义排序

    select * from OrderPolicyDetail order by ( case Project when 'C' then 1, when 'A' then 2, when 'D' t ...

  6. .Net Core with 微服务 - Elastic APM

    上一次我们介绍了Seq日志聚合组件.这次要给大家介绍的是Elastic APM ,一款应用程序性能监控组件.APM 监控围绕对应用.服务.容器的健康监控,对接口的调用链.性能进行监控.在我们实施微服务 ...

  7. Nginx网站服务

    1.常见的网站服务 静态网站服务: Apache服务 nginx服务 动态网站服务: Tomcat服务 PHP 2.nginx网站服务特点 (1)nginx具有高并发(特别是静态资源).占用系统资源少 ...

  8. 23、nginx动态添加nginx_upstream_check_module健康检查模块

    nginx_upstream_check_module模块地址:https://github.com/yaoweibin/nginx_upstream_check_module 23.1.说明: 1. ...

  9. activiti版本下载

    activiti工作流历史各个版本下载地址修改版本号后在浏览器地址栏回车即可 例如: https://github.com/Activiti/Activiti/releases/download/ac ...

  10. STM32F103学习进程

    软硬件下载程序和程序运行的相关问题和解决方案,以我自身买的STM32F103C8T6为例 (1) 硬件需要 1. 购买一个STM32F103XXX的板子.这是一个操作实践性非常强的一个学习过程,如果没 ...