classSolution{publicbooleancontainsNearbyAlmostDuplicate(int[]nums,intk,intt){TreeSet<Long>set=newTreeSet<>();for(inti=0;i<nums.length;++i){finallongnum=(long)nums[i];finalLongceiling=set.ceiling(num);// The smallest num >= nums[i]if(ceiling!=null&&ceiling-num<=t)returntrue;finalLongfloor=set.floor(num);// The largest num <= nums[i]if(floor!=null&&num-floor<=t)returntrue;set.add(num);if(i>=k)set.remove((long)nums[i-k]);}returnfalse;}}
classSolution{public:boolcontainsNearbyAlmostDuplicate(vector<int>&nums,intk,intt){if(nums.empty()||k<=0||t<0)returnfalse;constlongmin=*min_element(begin(nums),end(nums));constlongdiff=t+1L;// In case of t = 0// Use long because corner case INT_MAX - (-1) will overflowunordered_map<long,long>bucket;for(inti=0;i<nums.size();++i){constlongnum=nums[i];constlongkey=getKey(num,min,diff);if(bucket.count(key))// Current bucketreturntrue;if(bucket.count(key-1)&&num-bucket[key-1]<diff)// Left adjacent bucketreturntrue;if(bucket.count(key+1)&&bucket[key+1]-num<diff)// Right adjacent bucketreturntrue;bucket[key]=num;if(i>=k)bucket.erase(getKey(nums[i-k],min,diff));}returnfalse;}private:intgetKey(longnum,longmin,longdiff){return(num-min)/diff;}};