java实现“求平方根”
题目要求:
实现函数 int sqrt(int x).
计算并返回 x 的平方根(向下取整)
数据范围: 0 <= x < 231−1
要求:空间复杂度 :O(1),时间复杂度 :O(logx)
示例1
输入:
2
复制
返回值:
1
复制
示例2
输入:
2143195649
复制
返回值:
46294
思路:
题外话:首先这题的意图就是让我们实现一个sqrt方法.所以不能用库函数来解,如果是面试官出的题,这也是他们最不希望看到的.
这个题目拿到后我们可以先找一下规律
0,1的平方根为本身
2,3的平方根小于3的一半
4的平方根为2
比4大的数(这里用 n 表示)的平方根都小于n / 2
那么就可以使用二分法来做.这也是我拿到这个题目的第一想法.
确定好思路之后就开始编写代码
- 先处理特殊情况 x = 1, x = 0;
- 编写核心代码:使用二分法找出平方根
- 返回值
当然这题有很多需要注意的细节,不然在各大刷题平台通过率也不会达到33%
- 我们知道二分法的几种表达式第一种为 mid = (left + right) / 2,这种表达式在做题中其实用的最少,原因也很简单,当left和right很大时怕越界.可以代替为mid = low + ((high - low) >> 1).或者mid = left + (right - left) / 2;
还有一个为mid = left + (right - left + 1) / 2;这个(right - left + 1)和上面的区别就是能保障 mid 处在中间数靠右的位置(也就是向上取整),例如正常的(int) mid = 3 + (10 - 3) / 2 = 6,而用这个表达式为 mid = 3 + (10 - 3 + 1) / 2 = 7;这个细节在一定的情况下可以提示代码的效率,例如这题. - 在写判断条件时,肯定是将大概率的事件写在前面,这样可以减少代码的执行量.所以在这题中,因为n>4之后的平方根都在n / 2的左边,更大的n他的平方根可能要在n / 4或者更左边,所以我们肯定是先判断
向左二分的这种情况.因此写代码也要这样写.