
因为是看别人的顺序刷题,所以直接想到可以二分法找(找整数部分)
我的错误答案
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,然后浮点数有误差,所以要在附近找
牛顿迭代
没学
