我有一个非常长的数组[]。我的算法需要找到number []中的最低索引j,其中|numbers[j] - numbers[i]| <= x
(随机变量)或|numbers[j] - numbers[i]| >= m - x
(m另一个变量,大于x)和i<j
。
这是我的算法:
for (int j = 1; j < numbers.Length; j++)
{
for (int i = 0; i < j; i++)
{
long diff = Math.Abs(numbers[j] - numbers[i]);
if (diff <= x || diff >= m - x)
return j;
}
}
这可以更有效地完成吗?例如,输入数字非常高的笔记本电脑需要36秒钟。
答案 0 :(得分:1)
你可以在O(nlogn)中通过遍历数组并在每个阶段将新数字添加到平衡搜索树来完成此任务。
添加号码时,首先搜索搜索树中已有的最近号码。如果此数字小于目标差异,那么您已找到答案。