题目描写叙述:
Given an array of integers, find out whether there are two distinct indices i and j in the array such that the difference between nums[i] and nums[j] is at most t and the difference between i and j is at most k.
就是给定1个数组nums,以及索引最大间隔k,和值最大间隔t。在nums数组内,找出是否存在num[i],和nums[j],当中i,j ∈[0,nums.Length-1]。使得 abs(i-j) <= k 而且 abs(nums[i]-nums[j]) <= t
思路:
1. 遍历nums数组,使用BST来存nums[i]在k范围内全部可达的数
2. 使用SortedSet<T>这个数据结构来存放从i到k范围内的每一个数,因为SortedSet的内部实现是平衡树
(http://stackoverflow.com/questions/3262947/is-there-a-built-in-binary-search-tree-in-net-4-0)。因此它的增删查都是log(n),所以算上外循环,整体复杂度是n*log(n)
3. 确定要查找的边界:
min = nums[i] - t; // 可取的最小值
max = nums[i] + t; // 可取的最大值
4. 假设sortedSet的长度大于 k。删除第一个。仅仅须要维护长度为k的数据就能够了
实现代码:
Given an array of integers, find out whether there are two distinct indices i and j in the array such that the difference between nums[i] and nums[j] is at most t and the difference between i and j is at most k.
就是给定1个数组nums,以及索引最大间隔k,和值最大间隔t。在nums数组内,找出是否存在num[i],和nums[j],当中i,j ∈[0,nums.Length-1]。使得 abs(i-j) <= k 而且 abs(nums[i]-nums[j]) <= t
思路:
1. 遍历nums数组,使用BST来存nums[i]在k范围内全部可达的数
2. 使用SortedSet<T>这个数据结构来存放从i到k范围内的每一个数,因为SortedSet的内部实现是平衡树
(http://stackoverflow.com/questions/3262947/is-there-a-built-in-binary-search-tree-in-net-4-0)。因此它的增删查都是log(n),所以算上外循环,整体复杂度是n*log(n)
3. 确定要查找的边界:
min = nums[i] - t; // 可取的最小值
max = nums[i] + t; // 可取的最大值
4. 假设sortedSet的长度大于 k。删除第一个。仅仅须要维护长度为k的数据就能够了
实现代码:
public class Solution {
public bool ContainsNearbyAlmostDuplicate(int[] nums, int k, int t) {
if(k < 1 || t < 0){
return false;
}
if(nums == null || nums.Length == 1)
{
return false;
}
var map = new SortedSet<int>();
for(var i = 0 ;i < nums.Length; i++)
{
if(nums[i] > Int32.MaxValue){
return false;
}
if(map.Count > k){
map.Remove(nums[i-k-1]);
}
var max = nums[i] + t;
if(nums[i] > 0 && max < 0){
max = Int32.MaxValue;
}
var min = nums[i] - t;
var found = map.GetViewBetween(min,max);
if(found.Count > 0){
return true;
}
map.Add(nums[i]);
}
return false;
}
}