【每日算法】存在重复元素 III
题目描述
这是 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的更多相关文章
- Leetcode 220.存在重复元素III
存在重复元素III 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. ...
- Java实现 LeetCode 220 存在重复元素 III(三)
220. 存在重复元素 III 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最 ...
- [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 ...
- 220. 存在重复元素 III
题目: 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. 示例 1: ...
- LeetCode220 存在重复元素 III
给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. 示例 1: 输入: ...
- [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 ...
- [LeetCode]220. 存在重复元素 III
题目链接:https://leetcode-cn.com/problems/contains-duplicate-iii/ 题目描述: 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使 ...
- Leetcode 存在重复元素 (219,220)
219. 存在重复元素 II 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k. / ...
- [LeetCode] 217. Contains Duplicate 包含重复元素
Given an array of integers, find if the array contains any duplicates. Your function should return t ...
随机推荐
- KIP-5:Apache Kylin深度集成Hudi
Q1. What are you trying to do? Articulate your objectives using absolutely no jargon. Q2. What probl ...
- Golang使用proto3协议导致零值字段不显示
Golang使用proto3协议导致零值字段不显示 问题描述 proto协议生成的结构体如果使用直接转成json会导致零值字段不显示,这样的json是有毛病的,可以使用如下方法解决 示例Demo pa ...
- pipenv管理模块和包
pipenv安装 1. 在终端输入:pip install pipenv进行安装 用pipenv创建虚拟环境:pipenv install,在哪个文件下运行这个命令,就是给哪个文件创建虚拟环境 这 ...
- 基于HSI和局部同态滤波的彩色图像增强
简介 在图像采集过程中,由于光照环境或物体表面反光等原因会造成图像光照不均 .图像的光照不均会直接影响图像分析的结果.因此,对光照不均图像进行增强,消除光照的影响是光照不均图像处理中不可缺少的环节 . ...
- nginx负载均衡与反向代理
1.集群的特点 (1)高性能 (2)价格有效性 (3)可伸缩性 (4)高可用性 (5)透明性 2.负载均衡概述 负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡.分 ...
- 10、pfile和spfile文件详解
10.1.介绍: 1.Oracle中的参数文件是一个包含一系列参数以及参数对应值的操作系统文件.它们是在数据库实例启动时候加载的, 决定了数据库的物理结构.内存.数据库的限制及系统大量的默认值.数据库 ...
- 详细解释 使用FileReference类加载和保存本地文件
一般而言,用户不希望web浏览器中运行的应用程序访问电脑硬盘里的文件.然而,随着基于浏览器(browser-based)的富因特网应用程序的增多,一些应用程序迫切需要访问用户所选择的文件,或者将文件保 ...
- .net获取项目根目录方法集合
这篇文章是别的博客复下来,收藏的: 编写程序的时候,经常需要用的项目根目录.自己总结如下 1.取得控制台应用程序的根目录方法 方法1.Environment.CurrentDirectory ...
- SpringBoot:WebSocket使用Service层的方法
方法一: 创建工具类 ApplicationContextRegister.java import org.springframework.beans.BeansException; import o ...
- HTTP:HTTP请求头和响应头详解
HTTP请求报文 HTTP 请求报文由3部分组成(请求行+请求头+请求体) HTTP请求报文分析 1. 是请求方法,GET和POST是最常见的HTTP方法,初次以外还包括 DELETE.HEAD.O ...