题目:
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1: 输入: 4 输出: 2
示例 2:输入: 8 输出: 2
说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrtx
思路:
采用二分查找的方法,逐渐寻找接近结果的值。
Python解法:
1 class Solution: 2 def mySqrt(self, x: int): 3 if x == 0 or x == 1: 4 return x 5 left = 0 6 right = x//2+1 7 while left <= right: 8 mid = (left + right) // 2 9 if mid * mid <= x and (mid+1) * (mid+1) > x: # 右边不能为= 10 return mid 11 elif x < mid * mid: 12 right = mid - 1 13 elif x > mid * mid: 14 left = mid + 1
C++解法:
1 class Solution { 2 public: 3 int mySqrt(int x) { 4 if (x == 0 || x == 1) 5 return x; 6 long left = 0; 7 long right = x / 2 + 1; // 对于一个非负数n,它的平方根不会大于n/2+1 8 while (left <= right) { 9 long mid = left + (right - left) / 2; // 防止溢出 10 if (x / mid >= mid && x / (mid + 1) < (mid + 1)) // 防止溢出 11 return mid; 12 else if (x / mid < mid) 13 right = mid - 1; 14 else if (x / mid > mid) 15 left = mid + 1; 16 } 17 } 18 };