Решение:
Вы можете сделать это O (1) пробел и O (m log (n)) время:
нет необходимости создавать какой-либо список для поиска,
Возможно, псевдокод содержит ошибки, но идея такова:
r: input number to search.
n,m: the ranges.
for (int i=1;i<=m;i++)
{
minVal = min(Search(i,1,n,r), minVal);
}
//x and y are start and end of array:
decimal Search(i,x,y,r)
{
if (i/x > r)
return i/x - r;
decimal middle1 = i/Cill((x+y)/2);
decimal middle2 = i/Roof((x+y)/2);
decimal dist = min(middle1,middle2)
decimal searchResult = 100000;
if( middle > r)
searchResult = Search (i, x, cill((x+y)/2),r)
else
searchResult = Search(i, roof((x+y)/2), y,r)
if (searchResult < dist)
dist = searchResult;
return dist;
}
поиск указателя в качестве домашней работы для читателя.
Описание: я думаю, что вы можете понять, что это за идея, по коду, но давайте проследим один из цикла for:
когда я = 1:
Вы должны искать по нижеуказанным номерам:
1,1 / 2,1 / 3,1 / 4, ...., 1 / п
Вы проверяете число с помощью (1,1 / cill (n / 2)) и (1 / floor (n / 2), 1 / n) и выполняете аналогичный двоичный поиск по нему, чтобы найти наименьшее.
Следует сделать это для цикла для всех предметов, поэтому будет выполнено м раз. и в каждый раз это занимает O (log (n)). эта функция может улучшаться по некоторым математическим правилам, но она будет сложной, я ее пропускаю.