因为是看别人的顺序刷题,所以直接想到可以二分法找(找整数部分)
我的错误答案
class Solution {
public int mySqrt(int x) {
if (x == 0){
return 0;
}
int low = 1,high = x;
while(low < high){
int mid = low + (high - low) / 2;
if (mid * mid > x){
high = mid - 1;
}
else if (mid * mid <= x && (mid + 1) * (mid + 1) > x){
return mid;
}
else{
low = mid;
}
}
return low;
}
}
虽说考虑了0,但是….x=2147395600就炸了…思路可能有点问题或者说是算法有点问题
二分法正解
找到k*k<=x的最大整数k
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;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/sqrtx/solution/x-de-ping-fang-gen-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
显然那个long是必须的
而且显然我想复杂了 我那个跑不完的
数学方法
禁用幂,可以凑,不过这个方法真的好吗….
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;
}
}
还是注意long,然后浮点数有误差,所以要在附近找
牛顿迭代
没学