Алгоритм из Leetcode Discussion использует двоичное дерево поиска для хранения диапазона значений из входного массива, чтобы проверить, содержит ли этот массив значения, отличающиеся не более чем на t, и их индексы не более чем на k друг от друга.
JAVA :
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
if (nums == null || nums.length == 0 || k <= 0) {
return false;
}
final TreeSet<Integer> values = new TreeSet<>();
for (int ind = 0; ind < nums.length; ind++) {
final Integer floor = values.floor(nums[ind] + t);
final Integer ceil = values.ceiling(nums[ind] - t);
if ((floor != null && floor >= nums[ind])
|| (ceil != null && ceil <= nums[ind])) {
return true;
}
values.add(nums[ind]);
if (ind >= k) {
values.remove(nums[ind - k]);
}
}
return false;
}
Я изо всех сил пытаюсь заставить это работать в C #. Этот код не работает, пока методы LastOrDefault
и FirstOrDefault
возвращают 0 по умолчанию. Как обойти, чтобы получить null
по умолчанию?
C #
public bool ContainsNearbyAlmostDuplicate(int[] nums, int k, int t)
{
if (nums == null || nums.Length < 2 || k < 1) return false;
SortedSet<long> set = new SortedSet<long>();
for (int i = 0; i < nums.Length; i++)
{
long l = (long)nums[i];
long floor = set.LastOrDefault(n => n <= l);
long ceil = set.FirstOrDefault(n => n >= l);
if ((l - floor <= t) || (ceil - l <= t))
return true;
set.Add(l);
if (i >= k) set.Remove((long)nums[i - k]);
}
return false;
}