public static int sqrt(int x) {
if(x == 0 || x == 1){
return x;
}
long start = 0;
long end = x;
while (end-start > 1){
long mid = (int)(end + start)/2;
long s = mid * mid;
if(s == x){
return (int)mid;
}
else if(s > x){
end = mid;
}
else {
start = mid;
}
}
return (int)start;
}
Выше приведен фрагмент рабочего кода. У меня есть вопросы, как показано ниже. Заранее благодарю за помощь. ;-)Двоичный поиск квадратного корня из leetcode oj
- В то время как (конечный старт> 1) зачем нам 1 здесь? просто потому, что знак возврата является int?
- Если мы сменим цикл while (конец-конец> 1) на (end> start), мы должны сделать end = mid-1; и start = mid + 1, правильно? Еще одно шаговое движение, я задаюсь вопросом, связано ли это также с возвратом типа integer?
- Почему мы не можем вернуть end? или (int) (начало + конец)/2 ?? Я видел почти 99% ответов, возвращенных в левую границу бинарного поиска. Я просто хочу знать, верно ли возвращение к правильной границе или к среднему?
Большое спасибо! Мина. Я сделаю больше исследований в вашей предлагаемой ссылке. Еще одна вещь, которая мне интересна, - почему бы не использовать while (end-start> 0.1), epsilon можно изменить на любое число, верно? Кроме того, я не думаю, что мы можем оставить end = mid или start = mid - это вызовет мертвую петлю - невозможно выпрыгнуть из цикла while – catlovespurple
@doglas Нет, это не вызовет бесконечный цикл, если это то, что вы имеете в виду coz 'else if (s> x) {end = mid;} else {start = mid;}' будет обновлять 'start' и' end' в каждом цикле. –
Нет. если вы попробуете следующий код, это не сработает. 'while (end> start) { long mid = (int) (end + start)/2; long s = mid * mid; if (s == x) { return (int) mid; } else if (s> x) { end = mid; } else { start = mid; } } ' – catlovespurple