一、题目
二、解题思路
1、 我的思路
我的思路是直接循环暴力破解,定义计数器i,从1开始递增,直到i*i大于或等于x
于是有了如下代码
int i = 1;while(true){if(i*i<x){i++;}else if(i*i==x){return i;}else{return i-1;}}
但提交之后超出了时间限制,看来需要改进代码质量
2、官方题解
方法一:袖珍计算器算法
class Solution {public int mySqrt(int x) {if (x == 0) {return 0;}int ans = (int) Math.exp(0.5 * Math.log(x));return (long) (ans + 1) * (ans + 1) <= x ? ans + 1 : ans;}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/sqrtx/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法二:二分查找
class Solution {public int mySqrt(int x) {int l = 0, r = x, ans = -1;while (l <= r) {int mid = l + (r - l) / 2;if ((long) mid * mid <= x) {ans = mid;l = mid + 1;} else {r = mid - 1;}}return ans;}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/sqrtx/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法三:牛顿迭代
class Solution {public int mySqrt(int x) {if (x == 0) {return 0;}double C = x, x0 = x;while (true) {double xi = 0.5 * (x0 + C / x0);if (Math.abs(x0 - xi) < 1e-7) {break;}x0 = xi;}return (int) x0;}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/sqrtx/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
3、一个小疑问
哦对了,这是作者写的另一段代码,其实思路和上一段代码基本一样,但是在输入2147395599时却没有得到期望的结果,程序在第一次循环时就return了,输出结果是1073697799,明明i*i>x,为什么循环还是走了if,没走else呢?期待小伙伴们的解答
public class LeetCode69 {public static void main(String[] args) {System.out.println(mySqrt(2147395599));}public static int mySqrt(int x) {if(x==1){return 1;}int i = x/2;while(true){if(i*i<=x){return i;}else{i--;}}}
}