Die Lösung: Das können Sie tun O(1) Raum und O(m log(n)) Zeit:
Es ist nicht notwendig, eine Liste für die Suche zu erstellen,
Der Pseudocode kann fehlerhaft sein, aber die Idee ist folgende:
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;
}
den Index als Hausaufgabe für den Leser zu finden.
Beschreibung: Ich denke, Sie können verstehen, was ist die Idee von Code, aber lassen Sie eine Spur von einer for-Schleife: wenn i=1:
sollten Sie innerhalb der folgenden Nummern suchen: 1,1/2,1/3,1/4,....,1/n Sie überprüfen die Zahl mit (1,1/cill(n/2)) und (1/floor(n/2), 1/n) und führen eine ähnliche binäre Suche durch, um die kleinste Zahl zu finden.
Diese for-Schleife sollte für alle Elemente durchgeführt werden, damit sie erledigt werden kann m Zeit. und in jeder Zeit dauert es O(log(n)). diese Funktion kann durch einige mathematische Regeln verbessert werden, aber es wird kompliziert sein, ich überspringe es.