算法练习第39题-x 的平方根

165 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情

一、题目

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

 

示例 1:

输入:x = 4
输出:2
示例 2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/sq… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路

  • 二分查找
    • 定义左右区间,left = 0, right = x, 定义中间值mid

    • mid = left + ((right - left)>>1)

    • 增加部分是用移位运算符,防止溢出

    • 有三种情况

    • 当mid*mid === x, 返回Math.floor(mid)

    • 当mid*mid < x, 左区间等于mid + 1

    • 当mid*mid > x, 这是就取到了平方后最接近x的值

    • right = mid -1 最后返回right

    • 移位算法符
    • 分别有<<左移位运算符,效果是数值增大,>>右移位运算符,效果是数值减小,还有个>>>执行无符号右移位运算。 原理是把数字转换成二进制,比如 2 转换为二进制就是10, 向右移动一位就是01,写作:2>>1, 左移位运算符同理

三、代码

// let x = 8
// let x = 4
let x = 9
let mySqrt = function(x) {
  /**
   * 二分查找
   * 定义左右区间,left = 0, right = x, 定义中间值mid
   * mid = left + ((right - left)>>1)
   * 增加部分是用移位算法,防止溢出
   * 有三种情况
   * 当mid*mid === x, 返回Math.floor(mid)
   * 当mid*mid < x, 左区间等于mid + 1
   * 当mid*mid > x, 这是就取到了平方后最接近x的值
   * right = mid -1 最后返回right
   * 
   * */ 
  let left = 0, right = x 
  while(left <= right) {
    let mid = left + ((right - left)>>1)
    let result = mid*mid
    if(result == x) {
      return Math.floor(mid)
    } else if(result > x) {
      right = mid - 1
    } else {
      left = mid + 1
    }
  }
  return right
}
mySqrt(x)

四、测试结果

image.png