题目

image.png

题解

这道题是实现一个Math.sqrt()函数。要使用二分算法,二分算法算是双指针中的一种特殊情况。按照双指针的解法,我们先确定指针指向初始值,左指针不用说指向最小值也就是1,而右指针的指向就需要考虑一下啦,如何让搜索范围变小。你会发现平方根会在x的左侧出现。那吗可以将右指针指向x的一半。但是二分算法有两种情况,一种树奇数情况下,一种就是在偶数的情况下。奇数不用说,偶数的情况下会有两个值,我们应该取那个值?题目给出的是,只保留整数部分,小数部分直接去掉,那就是要偶数情况下的左值。
图例偶数情况下
二分算法-求平方根.gif

二分

  1. /**
  2. * @param {number} x
  3. * @return {number}
  4. * 平方根在 x一半的左侧
  5. */
  6. var mySqrt = function(x) {
  7. if(x < 2) return x;
  8. let l = 1;
  9. let r = x >> 1;
  10. let mid = 0;
  11. let square = 0;
  12. while(l <= r) {
  13. mid = (l + r) >> 1;
  14. square = mid * mid;
  15. if(square == x) return mid;
  16. else if (square > x) r = mid - 1;
  17. else l = mid + 1
  18. }
  19. // 结束条件是 l 大于 r 那吗r会比l小,题意中是只保留整数部分,舍去小数,故取小值也就是r
  20. return r
  21. };