【数学】C020_x的平方根(暴力枚举 | 二分查找 | 牛顿迭代)

 ̄綄美尐妖づ 提交于 2020-01-19 00:55:24

一、题目描述

实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

 输入: 8
 输出: 2
 说明: 8 的平方根是 2.82842...,由于返回类型是整数,小数部分将被舍去。

二、题解

(1) 枚举

/**
 * 枚举:
 * 执行用时  32ms 击败了 5.8% 的java用户
 * 内存消耗 MB 击败了 % 的java用户
 * @param x
 * @return
 */
public int mySqrt1(int x) {
  if(x < 1) return 0;
  // 任何一个数的平方根都小于等于它的二分之一加一
  for (long i = 0; i <= (x>>>1) + 1; i++) {
    if(i*i <= x && (i+1)*(i+1) > x)
      return (int)i;
  }
  return -1;
}

复杂度分析

  • 时间复杂度:
  • 空间复杂度:

(2) 二分查找

/**
 * 二分查找:
 *
 * 执行用时  ms 击败了 % 的java用户
 * 内存消耗 MB 击败了 % 的java用户
 * @param x
 * @return
 */
public int mySqrt(int x) {

  // 如果l初始值Wie1,则不用考虑r要取右中数的问题。
  long l = 0;
  long r = (x>>>1) + 1;
  while (l < r) {
    long mid = (l+r+1) >>> 1;
    // 因为返回的是l,所以这里的if、else不能互换位置,比如:当x==1时,
    // l == 0,r == 1
    // mid == 1;
    // 1 * 1 = 1,故l=1;
    // 1 < 1 不成立退出循环
    /*如果互换了if、else的位置,那么
    * 1*1 = 1,r = mid-1 == 0。
    * 退出循环,返回l==0 */
    if(mid * mid > x)
      r = mid-1;
    else
      l = mid;
  }
  return (int)l;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!