题目介绍
题干:
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例1:
输入: 4
输出: 2
示例2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
题解思路
题乍一看,一个Math.sqrt()就可以解决,当我写完提交发现超过100%我就知道事情没那么简单,难道你面试就这样写?
其实题干的意思是自己编写sqrt方法,不要调用Math类的方法,当然这确实是一道比较简单的面试题,就看你自己的实现手法了
最早想到的就是直接一个一个的平方遍历,当然这是很暴力的手法,我们可以添加条件限制,范围给到从1到x/2 + 1即可
而且可以用二分查找算法来优化,当然这是正常的解法,官方题解中除此之外还给到一种另辟蹊径的计算方法,还提供了一种牛顿迭代法
这也许就是自己和算法大佬的差距吧,数学确实是一门优雅的学科,下面是代码演示
正确代码
class Solution {
public int mySqrt(int x) {
int l = 0;
int r = x / 2 + 1;
int ans = -1;
while (l <= r) {
int mid = (l + r) / 2;
if (Math.pow(mid, 2) <= x) {
ans = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
return ans;
}
}
总结
因为二分查找的缘故,时间复杂度为O(logn),代码和一般的二分查找基本一致,不存在生涩难懂的地方
一开始学习算法,经典的排序和查找算法就是我们必须所掌握的,他们蕴含的算法思想是我们工作和学习中值借鉴的
有机会自己要写一篇总结排序和查找算法的随笔,立一个flag先
文章如果存在问题或者有更好的题解,希望大佬斧正和评论,各自努力,你我最高处见