| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 | 
							- import (
 
- 	"math"
 
- )
 
- func containsNearbyAlmostDuplicate(nums []int, k int, t int) bool {
 
- 	if t < 0 || k <= 0 {
 
- 		return false
 
- 	}
 
- 	// Bucket sort. |a - b| <= t => |a/t - b/t| <= 1 => |floor(a/t) - floor(b/t)| <= 1,
 
- 	// we use t to split the nums into several buckets. Given key = floor(nums[i]/t), then
 
- 	// next number which meets the condiction is in [key-1, key+1].
 
- 	// When key1 == key2, the condiction is met; if |key1 - key2| == 1, we have to double
 
- 	// check the condiction is met or not. Maintain a k length map to ensure |i - j| <= k.
 
- 	bucket := make(map[int]int)
 
- 	gap := t
 
- 	if gap == 0 {
 
- 		gap = 1
 
- 	}
 
- 	for i := range nums {
 
- 		key := int(math.Floor(float64(nums[i]) / float64(gap))) // Return the floor of x/y
 
- 		if _, ok := bucket[key]; ok {
 
- 			return true
 
- 		}
 
- 		if n, ok := bucket[key-1]; ok && abs(nums[i]-n) <= t {
 
- 			return true
 
- 		}
 
- 		if n, ok := bucket[key+1]; ok && abs(nums[i]-n) <= t {
 
- 			return true
 
- 		}
 
- 		bucket[key] = nums[i]
 
- 		if k <= i {
 
- 			delete(bucket, nums[i-k]/gap)
 
- 		}
 
- 	}
 
- 	return false
 
- }
 
- func abs(x int) int {
 
- 	if x < 0 {
 
- 		return -x
 
- 	}
 
- 	return x
 
- }
 
 
  |