题目要求: 对x求开方, m*m = x
思路:
Brute Force: 从1开始试验,直到大于x。
二分法: 已知结果的范围 [1, x/2+1],可以用binary search。
每次取半边,缩小范围。
注意选择m的区间:
if(m <= x/m && x/(m+1) < m+1) return m;
时间复杂度:
BF:O(m) 结果的数量
二分法:O(logx),这个在数据比较大的时候还是有明显优势的。毕竟是2的log
Code(C++):
class Solution {
public:
int mySqrt(int x) {
if(x < 0) return -1;
if(x == 0) return 0;
int l = <strong>1</strong>;
int r = <strong>x/2+1</strong>;
while(l<r) // 这里<= 或者< 都可以。
{
int m = l+(r-l)/2;
if(<strong>m <= x/m && x/(m+1) < m+1</strong>) return m;
else if(m > x/m) r = m+1;
else if(m < x/m) l = m-1;
}
return l+(r-l)/2;
}
};