1.主題の出典
リンク:69。xの平方根
2.トピック分析
序文:
2点で十分です。2番目のテンプレートを使用すると入力8と出力3の恥ずかしい状況が発生するため、2番目の二分テンプレートを使用しないように注意してください。2番目のテンプレートが見つからないため、最初のテンプレートはその場所よりも大きくなります。現在の二分テンプレートは、それよりも小さい最後の番号で停止します。
上記の理論に基づくと、ほとんどの根は小数です。小数の左側の整数はそれよりも小さいので、右側の整数はそれよりも大きいのではありません。したがって、2番目のテンプレートは使用しないでください。
- 時間計算量:O(n)O(n)O (n )。
- スペースの複雑さ:O(n)O(n)O (n )
コード:
// 中间值转 ll 取巧,判断越界
class Solution {
public:
int mySqrt(int x) {
int l = 0, r = x;
while (l < r) {
int mid = l + 1ll + r>> 1;
if (mid <= x / mid) l = mid;
else r = mid - 1;
}
return l;
}
};
class Solution {
public:
int mySqrt(int x) {
// j 将特殊情况进行特判
// 1. 防止while 一开始就进不去
// 2. 进去之后 mid 可能存在 0 的风险
if(x <= 1) return x;
int l = 0, r = x;
while (l < r) {
int mid = l + 0ll + r >> 1 ;
if (mid > x / mid) r = mid; // 不要写等于,减少判断,对自己好一点吧,让 l 找到第一个比根号 x 大的数
else l = mid + 1 ;
}
return l - 1 ;
}
};