220 Contains Duplicate III 存在重复 III
给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使 nums [i] 和 nums [j] 的绝对差值最大为 t,并且 i 和 j 之间的绝对差值最大为 k。
详见:https://leetcode.com/problems/contains-duplicate-iii/description/
Java实现:
TreeSet数据结构(Java)使用红黑树实现,是平衡二叉树的一种。
该数据结构支持如下操作:
floor()方法返set中≤给定元素的最大元素;如果不存在这样的元素,则返回 null。
ceiling()方法返回set中≥给定元素的最小元素;如果不存在这样的元素,则返回 null。
class Solution { public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) { TreeSet<Integer> set = new TreeSet<Integer>(); for(int i=0;i<nums.length;i++){ int n = nums[i]; if((set.floor(n)!=null&& n<=t+set.floor(n))||(set.ceiling(n)!=null && set.ceiling(n)<=t+n)){ return true; } set.add(n); if(i>=k){ set.remove(nums[i-k]); } } return false; } }
参考:https://www.cnblogs.com/jiajiaxingxing/p/4572871.html
https://www.jianshu.com/p/3e27c6fe284e
C++实现:
class Solution { public: bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) { int size=nums.size(); if(size==0||nums.empty()) { return false; } map<long long,int> m; int j=0; for(int i=0;i<size;++i) { if(i-j>k) { m.erase(nums[j++]); } auto idx=m.lower_bound((long long)nums[i]-t); if(idx!=m.end()&&abs(idx->first-nums[i])<=t) { return true; } m[nums[i]]=i; } return false; } };