【发布时间】:2018-07-28 17:52:01
【问题描述】:
我有一个已排序(升序)的实数值数组,称之为 a(可能重复)。我希望在给定一系列值 [x, y] 的情况下,找到存在索引 j 的值 (i) 的所有索引,使得: j>i 和 x
输出是一个长度为 a.Length 的布尔数组。 由于数组对所有前向差异进行排序,因此 x 和 y 是正数。
我设法做的最好的事情是从每个索引开始查看它前面的子数组,然后对 x+a[i] 执行二进制搜索并检查 a[j]
我应该注意,最终我想在同一个数组 a 上执行许多这样的范围 [x,y] 的搜索,但是范围的数量远远小于数组的长度(4-6 个幅度更小) - 因此我更关心搜索的复杂性。
例子:
a= 0, 1, 46, 100, 185, 216, 285
范围 x,y=[99,101] 应该返回:
[true, true, false, false, true, false, false]
只有值 0,1 和 185 在该范围内具有正向差异。
内存中的代码,可能有一些错误:
int bin_search_closesmaller(int arr[], int key, int low, int high)
{
if (low > high) return high;
int mid = (high - low)/2;
if (arr[mid] > key) return bin_search_closesmaller(arr, key, low, mid - 1);
if (arr[mid] < key) return bin_search_closesmaller(arr, key, mid + 1, high);
return mid;
}
bool[] findDiffs(int[] a, int x, int y)
{
bool[] result = new bool[a.Length];
for(int i=0; i<a.Length-1;i++)
{
int idx=bin_search_closesmaller(a, y+a[i], i+1, a.Length-1);
if (idx==-1) continue;
if (a[idx]-a[i] >= x) result[i]=true;
}
}
谢谢!
【问题讨论】:
-
你能添加一个示例数组和范围吗?
-
The best I’ve managed to do- 你能展示你的尝试吗?这是一个有趣的问题,由于问题中缺少代码,我不想看到它关闭。 -
@NightOwl888 我添加了我的尝试
标签: c# arrays algorithm binary-search