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部分的解释:宫水三叶

相关内容

热门资讯

31省份上半年GDP公布,6省... 【大河财立方 记者 程帅星】7月中下旬,全国31个省(区、市)(不含港澳台)陆续公布2026年上半年...
银行间主要利率债午间走势分化 每经AI快讯,7月28日,银行间主要利率债午间走势分化,30年期国债“26超长特别国债04”收益率下...
2026海河国际消费论坛即将在... 2026海河国际消费论坛将于7月30日下午在天津启幕,目前各项筹备工作已全部就绪。本届论坛以“创新服...
原创 一... 前言 1942年的一天,一名身穿军装的年轻人,悄悄走到一位老妇人的面前。他脸上带着疲惫,眼神中却依然...
原创 曹... 八十岁的曹德旺,这几年在公开场合谈到房子这两个字,语气一次比一次冷。他早年那句"房子不过是钢筋水泥堆...
股息率近5.5%!港股红利低波... 7月28日,港股红利资产延续强势。截至13时48分,港股红利低波ETF招商(520550)涨0.46...
企业文件共享平台怎么选?主流方... 文件共享平台种类繁多,各有侧重。今天这篇文章,把2026年市面上主流的企业文件共享平台做个系统梳理,...
币圈院士:7.26以太坊(ET... 币圈院士:7.26以太坊(ETH)双周期指标暗藏方向,行情即将破位?最新行情分析参考 以太坊现价18...
老铺黄金发盈喜后股价跌16.2... 观点网讯:7月28日,老铺黄金股价裂口低开12.97%,最低见325.8港元,收盘报332港元,跌1...
苏泊尔上半年营收净利双降,法籍... 瑞财经 严明会 近日,苏泊尔(002032.SZ)披露2026年半年度业绩快报。 公告显示,公司上半...
IPO雷达|陕西瑞科回复二轮问... 深圳商报·读创客户端记者 梁佳彤 7月27日,据北交所官网,陕西瑞科新材料股份有限公司(下称“陕西瑞...
普京签令,俄军扩编 据新华社报道,俄罗斯总统普京27日签署命令, 决定组建几支军事建筑工程部队,并将俄武装力量编制总人数...
2027年德国杜塞尔多夫国际铸... 展会名称:2027年德国杜塞尔多夫国际铸造、冶金、热处理及铸件展览会GMTN 开始时间:2027-0...
郑州有了温通刮痧培训示范基地 本报讯(记者 杨振东 通讯员 张丹婧)温通刮痧是中医外治法里的一种,简单说就是在传统刮痧基础上,结合...
整箱茅台和单瓶茅台,回收行情为... 不少天津藏友存在疑惑:同样年份、同样品相的飞天茅台,整箱装和拆箱单瓶的回收报价存在差距,不清楚背后的...
北京五粮液收购需要遵循哪些通用... 北京五粮液收购的行业背景 近年来高端白酒的收藏与流通市场规模稳步扩张,北京作为国内重要的消费城市,五...
微软CEO重磅警告:只依赖一家... 来源:环球网 【环球网科技综合报道】7月28日消息,据外媒TechCrunch报道,微软CEO萨提亚...
策略师:金价夏季维持4000美... 汇通财经APP讯——今夏金价大概率在4000美元/盎司附近震荡筑底,市场等待美联储货币政策清晰指引。...
大众叙事下白酒行业周期如何拆解... 白酒行业的波动往往并非单纯由供需关系决定,而是 宏观经济预期与 渠道库存周期共振的结果。在大众认知中...
沈皓南:黄金低位大区间运行,短... 大家好,我是沈皓南,差不多有一个月没有更新黄金文章了,这段时间我去了美丽的新疆,自驾了独库公路,观赏...