共计 959 个字符,预计需要花费 3 分钟才能阅读完成。
一、题目粗心
给你一个整数数组 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 老板是公司的支柱,公司的支柱是全身心投入到公司的人
正文完