整数数组包含的元素使得每个元素比其前一个元素多1个或更少。现在我们给出一个数字,我们需要确定该数字在数组中首次出现的索引。 需要优化线性搜索。它不是作业。
答案 0 :(得分:1)
我的算法是这样的:
说A [p]> X。然后,由于A项增加或减少1,idx肯定至少(A [p] - x)指数远离p。同样的原则适用于A [p]< X
int p=0, idx=-1;
while (p<len && p>=0)
if (A[p]==x)
idx = p;
else
p+= abs(x-A[p]);
时间复杂度:最坏的情况是O(n)。我希望平均情况比O(n)好(我认为它是O(log n)但不确定)。 运行时间:绝对优于所有情况下的线性搜索。
答案 1 :(得分:0)
你不能比线性更快。以下代码应该尽可能快:
int findFirstIndex(int num, int[] array) {
int i = 0;
while (i< array.length)
if (array[i] == num) return i;
else i += abs(array[i] - num)
return -1
}
但在最坏的情况下,它仍然是O(array.length)。例如,如果您在仅包含0的数组中查找1,那么您就不能跳过任何位置。
答案 2 :(得分:0)
从第一个位置开始;现在考虑搜索到的数字N和第一个数字之间的差异。如果array [0] == N那么我们就完成了;否则我们必须跳过abs(array [0] -N)的位置;现在重复此操作直到数组结束。