题目描述:
求一个整数 x 的平方根,返回整数,结果是小数 ,就向下取整。
思路:
x的平方根 一定在 [1,x ] 区间内,使用二分查找,在 O(log x) 时间就可找到。
代码如下所示。
1 class Solution { 2 public: 3 //二分法 Time O(log x) 空间 O(1) 4 int mySqrt(int x) 5 { 6 int l = 1,h = x; // 目标值一定在 区间[l,h]内 7 while(h - l > 1) //在区间只剩下两个元素时就要跳出循环,防止陷入死循环 8 { 9 int mid = l + (h - l)/2; //取中位数时,当数组元素个数偶数时总是取前一个 10 if((long)mid*mid == x) return mid; // mid * mid 可能会超出 int 11 else if((long)mid*mid > x) //mid 肯定不是目标值了,区间范围缩小到[l,mid - 1] 12 { 13 h = mid -1; 14 } 15 else //mid 仍然可能是目标值 区间范围 [mid,h],设置 while 条件 为 h - l > 1就是为了防止此处陷入死循环 16 { 17 l = mid; 18 } 19 } 20 //区间内只可能还有 1 个元素 或者 2 个元素,优先取后面一个 21 return (long)h*h <= x?h:l; 22 } 23 };