编写一个接收非负数a
数组的函数,其大小为n
。
数组从低到高的数字排序,所有这些数字都计为t
。数组(n-t)
的其余部分包括零。
例如:
对于数组{1,5,5,7,8,0,0,0}
(t=5)
,函数返回8
。
对于数组{2,4,5,6,6,8,9,9}
t=8
,函数返回9
对于数组{0,0,0,0,0,0,0,0}
t=0
等等..
O(log(n))
int max_seq(int *a, int n)
{
int low = 0, high = n - 1, mid;
if (a[0] == 0) return 0; //a[n] = {0};
while (high > low)
{
mid = (high + low) / 2;
if (a[mid] == 0) // value is zero
high = mid - 1;
else //value is positive number
if (a[mid + 1] == 0) //next number is zero
return a[mid];
else // next number is positive number
low = mid + 1;
}
if (high == low)
return a[low];
}
但问题是,如何使用(log(t))的运行时运行程序? (虽然t未知)
答案 0 :(得分:0)
在进行分而治之之前,您可以从数组的开头搜索low
和high
的更优化初始值,并在每次迭代中将索引加倍:
while(1) {
if(high >= (n - 1)) {
high = n - 1;
break;
}
if(a[high] == 0)
break;
low = high;
high *= 2;
}