LeetCode--69:x 的平方根(java)

原题链接
二分查找的前提:

  • 目标函数单调性(单调递增或者递减)
  • 存在上下界
  • 能够通过索引访问
    方法1:二分法
    首先计算一个公式:(x / 2 + 1)2 = x2 / 4 + x + 1 一定是 > x 的,所以当 x 是大于 1 的整数时,它的平方根一定在 1 到 (x / 2 + 1)之间
	public int mySqrt(int x) {
		//二分法:
		if (x == 1 || x == 0) return x;
        int start = 1;
        int end = x / 2 + 1; //最终结果一定是在 start 和 end 之间
        int mid = 0;
        while (start <= end) {
            mid = start + (end - start) / 2;//防止整型溢出
            //满足这个条件的就是 x 的 int型平方根了,而且一定存在
            if (mid <= x / mid && (mid + 1) > x / (mid + 1)) return mid;
            if (mid > x / mid) {
                end = mid - 1;
            } else {
                start = mid + 1;
            }
        }
        return 99999;//最后这个随便return
    }

方法2:牛顿迭代法
详细题解
没听过这个方法的人很难想出来,可以作为额外知识点了解

//方法2:牛顿迭代法	80%  79%
	public int mySqrt(int x) {
		long r = x;
		while(r * r > x) { //循环结束时,说明 r * r 第一次 <= x,也就是最终结果
			r = (r + x / r) / 2;
		}
		return (int)r;
	}
发布了24 篇原创文章 · 获赞 3 · 访问量 553

猜你喜欢

转载自blog.csdn.net/QinLaoDeMaChu/article/details/103955584