写点什么

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

用户头像
Lee Chen
关注
发布于: 2021 年 02 月 01 日
LeetCode题解:69. x 的平方根,二分查找,JavaScript,详细注释

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


解题思路:


  1. 该题相当于是对于 $y=t^{z-1}$,已知 $y$求 $x$,并且 $y$为正整数,意味着在 $x > 0$时,$y$是一条单调递增的曲线。

  2. 因此,该题可以简化为在 $0$到 $x$之间寻找一个数,它的平方等于 $x$,并将其整数部分作为结果返回。

  3. 使用二分查找,每次在 $left$和 $right$之间取中值 $mid$,判断 $mid^{2}$与 x 的大小。

  4. 如果 $mid^{2}$比 x 大,表示结果在 $left$到 $mid$之间,否则在 $mid$到 $right$之间。

  5. 不断重复步骤 3 和 4,最终左右指针会相遇,此时 $mid=left=right$,$mid^{2}$会有两种情况:

* $mid^{2}$大于 $x$时,最终结果在 $mid$到 $mid-1$之间,经过四舍五入后为 $mid$,也就是退出循环后的 $right$的值。

* $mid^{2}$等于 $x$时,退出循环后,$right$即为 $mid$的值。

  1. 因此最终将 $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;};
复制代码


发布于: 2021 年 02 月 01 日阅读数: 15
用户头像

Lee Chen

关注

还未添加个人签名 2018.08.29 加入

还未添加个人简介

评论

发布
暂无评论
LeetCode题解:69. x 的平方根,二分查找,JavaScript,详细注释