来自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;
}
一种方法是用可空的long声明你的集合
var set = new SortedSet<long?>();
或者您可以不使用FirstOrDefault
并执行以下操作:
var greaterOrEqualToOne = set.Where(n => n >= 1);
long? ceil = greaterOrEqualToOne.Any() ? greaterOrEqualToOne.First() : null;
换句话说,首先将它们投射到long?
:
long? ceil = set.Select(n => (long?)n).FirstOrDefault(n => n >= 1);
使用nullable long在LastOrDefault上获取null
SortedSet<long?> set = new SortedSet<long?>();
如果要检索包含null的int / long / ...值,则需要使用Nullable Types
在您的源代码中将是:
SortedSet<long?> set = new SortedSet<long?>();
其他答案在技术上是正确的(在您的设置上使用可空类型)
SortedSet<long?> set = new SortedSet<long?>();
但是,为了从FirstOrDefault
/ LastOrDefault
获得空值,您需要将int?[] nums
传递给您的方法,因为您通过投射填充您的集合
long l = (long)nums[i];
即使在转换为可空的long?
时,它也不会从int数组中获取null值。
换句话说 - 您的方法需要获取可空数组才能使用空值。
如果你不会在提供的数组上使用null,为什么不从i = 1
迭代?
如果要将int,long ...值声明为NULL,则需要声明如下:
int? empId;
if(empId is null)
{
// do this
}
else
{
//do this
}
以同样的方式使用:
SortedSet<long?> sortedSet = new SortedSet<long?>();
你可以像其他用户所说的那样将int / long转换为可空类型(?),然后使用DefaultIfEmpty
创建一个默认集合,如果集合结果为空,则包含null。
SortedSet<long?> set = new SortedSet<long?>();
long? floor = set.Where(n => n <= l).DefaultIfEmpty().LastOrDefault();
long? ceil = set.Where(n => n >= l).DefaultIfEmpty().FirstOrDefault();