Мне сложно понять, как увеличить или понизить уровень.Двоичный поиск, когда я должен увеличивать или понижать?
Например, это вопрос из leetcode:
Реализовать INT SQRT (INT х).
Мой код:
class Solution {
public:
int mySqrt(int x) {
if (x<=0) return 0;
int low=1, high=x, mid=0;
while (low<=high){ // should I do low<high?
mid=low+(high-low)/2;
if (x/mid==mid) return mid;
if (x/mid>mid) low= mid+1; //can I just do low=mid?
else high=mid-1; // can I do high =mid?
}
return high; //after breaking the loop, should I return high or low?
}
};
Вы видите, после того, как условие fufill, я не знаю, должен ли я установить low=mid
ИЛИ low=mid+1
. Почему mid+1
?
В общем, у меня возникли проблемы с тем, следует ли мне увеличивать низкий уровень с середины или нет. У меня также возникают проблемы, когда я должен включать low <= high
или low < high
в петлю while
.
если (х/средний = = mid) return mid; здесь вы проверяете середину как квадратный корень, если это тогда, то оно возвращается отсюда. поэтому мы склонны не проверять его снова. Итак, мы делаем low = mid + 1 и high = mid -1 – sinsuren
И этим методом вы не получите квадратный корень из любого числа, за исключением нескольких случаев. – sinsuren
Читайте здесь. Надеюсь, это очистит все ваши сомнения. http://www.geeksforgeeks.org/square-root-of-a-perfect-square/ – sinsuren