LeetCode题解:69. x 的平方根,二分查找,JavaScript,详细注释

原题链接:https://leetcode-cn.com/problems/sqrtx/

解题思路:

  1. 该题相当于是对于 y = t z − 1 y=t^{z-1} y=tz1,已知 y y y x x x,并且 y y y为正整数,意味着在 x > 0 x > 0 x>0时, y y y是一条单调递增的曲线。
  2. 因此,该题可以简化为在 0 0 0 x x x之间寻找一个数,它的平方等于 x x x,并将其整数部分作为结果返回。
  3. 使用二分查找,每次在 l e f t left left r i g h t right right之间取中值 m i d mid mid,判断 m i d 2 mid^{2} mid2与x的大小。
  4. 如果 m i d 2 mid^{2} mid2比x大,表示结果在 l e f t left left m i d mid mid之间,否则在 m i d mid mid r i g h t right right之间。
  5. 不断重复步骤3和4,最终左右指针会相遇,此时 m i d = l e f t = r i g h t mid=left=right mid=left=right m i d 2 mid^{2} mid2会有两种情况:
    • m i d 2 mid^{2} mid2大于 x x x时,最终结果在 m i d mid mid m i d − 1 mid-1 mid1之间,经过四舍五入后为 m i d mid mid,也就是退出循环后的 r i g h t right right的值。
    • m i d 2 mid^{2} mid2等于 x x x时,退出循环后, r i g h t right right即为 m i d mid mid的值。
  6. 因此最终将 r i g h t right right的值作为结果返回即可。
/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
  let left = 0; // 查找的左边界
  let right = x; // 查找的右边界

  // 进行二分查找,当左右指针相遇时退出循环
  while (left <= right) {
    // 取中间值,答案必然中间值的左右其中一方
    // 使用这段代码也是同样效果
    // const mid = Math.floor((right + left) / 2);
    const mid = (left + right) >> 1;

    // 如果mid的平方大于x,表示最终结果在左半部分
    if (mid ** 2 > x) {
      // 重新确定左边界,下次循环在左半部分查找结果
      right = mid - 1;
    } else {
      // 如果mid的平方小于等于x,表示最终结果在右半部分
      // 重新确定右边界,下次循环在右半部分查找结果
      left = mid + 1;
    }
  }

  // 由于最后一次循环前,left和right相等,即mid=left=right
  // 此时mid的频繁只有两种可能情况,即为mid的平方大于或等于x
  // mid大于x时,最终结果在mid到mid-1之间,经过四舍五入后为mid,也就是退出循环后的right的值
  // mid等于x时,退出循环后,right即为mid的值
  // 两种情况退出后,right都是最终结果,因此只要返回right即可
  return right;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值