leetcode 220. Contains Duplicate III 存在重复元素 III(困难)

智码探险家
• 阅读 586

一、题目大意

给你一个整数数组 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 * 104
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 104
  • 0 <= t <= 231 - 1

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/...
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

这道题关注与不同值之间的关系,有两个限制条件,两个数字的坐标差不能大于k,值差不能大于t。还是用map结构来记录值和下标的映射。这里定义两上变量i和j,开始都指向0,然后i开始向右遍历数组,如果i和j之差大于k,且map中有nums[j],则删除并j+1,这样保证了map中所有的数的下标之差都不大于k,然后我们检查如果有值差小于等于则返回true。遍历最后返回false。

三、解题方法

3.1 Java实现

public class Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        int n = nums.length;
        TreeSet<Long> set = new TreeSet<>();
        for (int i = 0; i < n; i++) {
            Long ceiling = set.ceiling((long) nums[i] - (long) t);
            if (ceiling != null && ceiling <= (long) nums[i] + (long)t) {
                return true;
            }
            set.add((long) nums[i]);
            if (i >= k) {
                set.remove((long) nums[i - k]);
            }
        }
        return false;
    }
}

四、总结小记

  • 2022/10/13 老板是公司的支柱,公司的支柱是全身心投入到公司的人
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
好买-葡萄 好买-葡萄
3年前
【数据结构与算法】—— 二分查找
1.二分查找的概念二分查找指的是在排好序的数组中,找到目标元素。如果元素存在则返回元素的下标,不存在则返回1.下面以升序为例进行简单描述2.查找过程:取数组中间元素与查找元素target比较。如果target等于中间元素则直接返回中间元素的下标,如果target小于数组中间元素则在数组左边查找,如果target大于数组中间元素则在右边查找。重复以上步骤。
易娃 易娃
4年前
Golang简单写文件操作的四种方法
packagemainimport("bufio"//缓存IO"fmt""io""io/ioutil"//io工具包"os")funccheck(eerror){ifenil{panic(e)}}/判断文件是否存在存在返回true不存在返回false/func
Stella981 Stella981
3年前
C++ 之获取map元素[转]
链接:https://www.cnblogs.com/jianfeifeng/p/11089799.html  对于map对象,count成员返回值只能是0或者1,map容器只允许一个键对应一个实例。所以count可有效地表明一个键是否存在。count返回出现的次数。  find返回指向元素的迭代器,如果元素不存在,则返回end迭代器。 
Stella981 Stella981
3年前
Leetcode 703. 数据流中的第K大元素
1.题目要求设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。你的KthLargest 类需要一个同时接收整数 k和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用KthLargest.add,返回当前数据流中第K大的元素。示例:
Stella981 Stella981
3年前
Smali语法学习二
方法签名methodName(III)Lpackage/name/Object;methodName表示方法名,\\(III)\\表示该方法有三个int型参数,Lpackage/name/Object表示方法返回类型。方法的表示Lpackage/name/Object;—methodName(III)Z
Stella981 Stella981
3年前
LeetCode 5561. 获取生成数组中的最大值
文章目录1\.题目2\.解题1\.题目给你一个整数n。按下述规则生成一个长度为n1的数组nums:nums00nums11当2<2i<n时,nums2inumsi
Stella981 Stella981
3年前
Leetcode724:寻找数组的中心索引(java、python3)
寻找数组的中心索引给定一个整数类型的数组nums,请编写一个能够返回数组\\“中心索引”\\的方法。我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心索引,那么我们应该返回1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。
贾蔷 贾蔷
1个月前
洛谷P1102题解:利用哈希表优化的数对统计 C++代码解析
一、题目解读P1102题要求处理一组整数与常数C,统计数组中是否存在元素A与B满足ABC。用户需输出满足条件的数对数量。题目关键在于快速判断是否存在互补元素,时间复杂度需优化以避免暴力遍历。二、解题思路采用(unorderedmap)实现高效统计。首先遍