LC-220. 存在重复元素 III(滑动窗口+二分,桶排序)
admin
2024-03-08 21:11:40
0

220. 存在重复元素 III

难度困难666

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

滑动窗口+二分法

题解:https://leetcode.cn/problems/contains-duplicate-iii/solution/gong-shui-san-xie-yi-ti-shuang-jie-hua-d-dlnv/

class Solution {public boolean containsNearbyAlmostDuplicate(int[] nums, int indexDiff, int valueDiff) {int n = nums.length;//使用TreeSet,快速找到 小于等于x的最大值floor 或 小于等于x的最小值ceilingTreeSet set = new TreeSet<>();for(int i = 0; i < n; i++){Long num = nums[i] * 1L;Long l = set.floor(num); //找到小于等于num的最大值Long r = set.ceiling(num); // 找到大于等于num的最小值if(l != null && num-l <= valueDiff) return true;if(r != null && r-num <= valueDiff) return true;set.add(num);// 一个窗口内不可能存在两个大小相同的数,所以可以直接删除// 假设两个数下标是i和j(i < j),当遍历到j时,就会直接返回true了if(i >= indexDiff) set.remove(nums[i-indexDiff]*1L);}return false;}
}// 到i位置检查i-k位置上的元素是否满足要求,超时
// class Solution {
//     public boolean containsNearbyAlmostDuplicate(int[] nums, int indexDiff, int valueDiff) {
//         Set set = new HashSet<>();
//         Map map = new HashMap<>();//nums[i] i
//         for(int i = 0; i < nums.length; i++){
//             if(i > indexDiff) set.remove(nums[i-indexDiff-1]);
//             for(int key : set){
//                 if(Math.abs(nums[i]-key) <= valueDiff && Math.abs(map.get(key) - i) <= indexDiff){
//                     return true;
//                 }
//             }
//             set.add(nums[i]);
//             map.put(nums[i],i);
//         }
//         return false;
//     }
// }

桶排序

题解:https://leetcode.cn/problems/contains-duplicate-iii/solution/gong-shui-san-xie-yi-ti-shuang-jie-hua-d-dlnv/

上述解法无法做到线性的原因是:我们需要在大小为 k 的滑动窗口所在的「有序集合」中找到与 u 接近的数。

如果我们能够将 k 个数字分到 k 个桶的话,那么我们就能 O(1) 的复杂度确定是否有 [u - t, u + t]的数字(检查目标桶是否有元素)。

具体的做法为:令桶的大小为 size=t+1size = t + 1size=t+1,根据 u 计算所在桶编号:

  • 如果已经存在该桶,说明前面已有 [u - t, u + t]范围的数字,返回 true
  • 如果不存在该桶,则检查相邻两个桶的元素是有 [u - t, u + t] 范围的数字,如有 返回 true
  • 建立目标桶,并删除下标范围不在 [max(0, i - k), i) 内的桶
class Solution {long size;public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {int n = nums.length;Map map = new HashMap<>();size = t + 1L;for (int i = 0; i < n; i++) {long u = nums[i] * 1L;long idx = getIdx(u);// 目标桶已存在(桶不为空),说明前面已有 [u - t, u + t] 范围的数字if (map.containsKey(idx)) return true;// 检查相邻的桶long l = idx - 1, r = idx + 1;if (map.containsKey(l) && u - map.get(l) <= t) return true;if (map.containsKey(r) && map.get(r) - u <= t) return true;// 建立目标桶map.put(idx, u);// 移除下标范围不在 [max(0, i - k), i) 内的桶if (i >= k) map.remove(getIdx(nums[i - k] * 1L));}return false;}long getIdx(long u) {return u >= 0 ? u / size : ((u + 1) / size) - 1;}
}

getIdx部分的解释:宫水三叶

相关内容

热门资讯

餐饮食材迈入生存竞争时代,华鼎... 【大河财立方 记者 丁洋涛】净利润率跌破3%、闭店率逼近50%、食材采购成本三年累涨22%……当餐饮...
段永平“举牌”泡泡玛特 普通人... 5月28日,泡泡玛特股价经历近一个月的震荡调整后,终于迎来了一次上涨。早盘涨幅一度逼近7%。截至收盘...
格隆汇公告精选︱*ST海利:拟... 【热点】 合锻智能(603011.SH):不涉及AI算力业务 沃格光电(603773.SH):在泛半...
因合规风控流于形式等违规行为,... 来源:滚动播报 (来源:北京商报) 北京商报讯(记者 刘宇阳 实习生 王思奕)5月28日,吉林证监局...
“易中天”股价盘中均创历史新高... 5月28日,A股三大指数集体收涨。截至收盘,沪指报4098.64点,涨0.12%;深证成指报1586...
从受制于人到填补全球空白,深圳... 【大河财立方 记者 王宇】5月28日,主题为“奋进‘十五五’民企勇担当”的国务院新闻办“新征程上的奋...
广州房贷“减负”:多家银行“商... 每经记者|陈荣浩 每经编辑|黄胜 5月26日,广州住房公积金管理中心发布《广州商业性个人住房贷款转...
2026年北京高端家庭服务市场... 引言 步入2026年,北京家庭服务市场正经历从“劳动力密集型”向“专业能力驱动型”的深刻变革。随着高...
亚马逊员工刷AI数据致算力成本... 亚马逊近日关闭了一项内部AI使用量排行榜。此前员工为冲排名、刻意刷高AI调用量,导致公司算力成本激增...
聚势AI向新 深圳加速构建产融... 上证报中国证券网讯(记者 徐潇潇)5月28日,记者在2026年第四届香蜜湖财富管理论坛了解到,本届论...
阿里语音大模型登顶Speech... 【太平洋科技快讯】据报道,在全球权威AI评测平台Artificial Analysis的Speech...
AI产业保险落地,真就利好赛道... 本篇为大家准备了5条要闻,都是近期大家关注度比较高的内容,看完能理清近期的产业和市场动向。一、要闻导...
智象未来CEO:多模态模型To... 【CNMO科技消息】5月28日,据36氪报道,智象未来CEO梅涛称:智象未来做的是全球唯三、能够达到...
原创 人... 国家统计局2026年1月19日交出了一份让人心情复杂的成绩单。2025年全年出生人口792万人,人口...
咽东西总觉得有个坎儿?半个月还... 很多人都有过这样的经历:吃饭时,感觉食物经过胸口某个地方“顿了一下”或“卡了一下”,好像被什么挡住似...
原创 A... A股市场正上演一场冰与火之歌。 一边是通信、电子等科技板块高歌猛进,另一边是消费、金融等传统行业持续...
原创 5... 2026年5月28日,国内黄金价格继续走低,现货黄金跌至每克986元,中国黄金的基础金价报985.7...
抖音生活服务开放日:打造所见即... 5月27日,抖音生活服务举办“2026年服务体验与治理开放日”活动,分享平台在消费者权益保护与体验提...