LeetCode精选Top面试题之x的平方根

629 阅读2分钟

这是我参与更文挑战的第7天,活动详情查看: 更文挑战

前言

公众号给npy的前端秘籍

加vx👉16639199716,拉你进群嗷~❤️

今天继续学习LeetCode精选面试题,今天选择第69题进行学习与总结~

题目描述

实现int sqrt(int x)函数 计算并且返回x的平方根,其中x是非负整数

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

示例1

输入:4

输出:2

示例2

输入:8

输出:2

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

解题思路

二分法的使用场景,其实比较受限,最明显的特点是:

绝大情况,查找目标具有单调性质(单调递增、单调递减) 有上下边界,并且最好能够通过index下标访问元素

基本的二分法使用

我们从一个最简单的单调递增数组开始说起,问题如下:

在 [1, 2, 3, 4, 5, 6, 7, 8, 9] 中找到 4,若存在则返回下标,不存在返回-1,要求算法复杂度O(logn)

看到上面这题目,O(logn)复杂度的要求,第一反应就是使用二分查找法,怎么做呢?

function searchNum (target, nums) {
  if (!nums.length) return -1
  let left = 0
  let right = nums.length - 1
  let mid
  while (left <= right) {
      // >> 1 位运算代替 除2 取整 操作
      // 为什么不写成 mid = (left+right)/2 ,因为考虑到left+right的溢出边界情况
      mid = left + ((right - left) >> 1)
      if (nums[mid] === target) {
          return mid
      }
      if (nums[mid] < target) {
          left = mid + 1
      }
      if (nums[mid] > target) {
          right = mid - 1
      }
  }
  return -1
}

我们可以从上面的问题中,看出点二分法的套路出来,二分法是有律可循的,并且可以推导出基础的模板:

let left = start
let right = end
let mid
while (left <= right) {
    mid = (left + right) / 2
    if (array[mid] === target) {
        return result 或者 break down
    }
    if (array[mid] < target) {
        left = mid + 1
    }
    if (array[mid] > target) {
        right = mid - 1
    }
}

我们得到二分法的基础模板后,就可以顺势解决 x的平方根 这种类型的题目了~

const mySqrt = function(x) {
     if (x < 2) return x
     let left = 1, mid, right = Math.floor(x / 2);
     while (left <= right) {
        mid = Math.floor(left + (right - left) / 2)
        if (mid * mid === x) return mid
        if (mid * mid < x) {
            left = mid + 1
        }else {
            right = mid - 1
        }
     }
     return right
}

总结

刷题打卡第13天,选择力扣第69题,学习了求x的平方根,一起加油哇~

❤️ 感谢大家

如果你觉得这篇内容对你挺有有帮助的话: 点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)关注公众号给npy的前端秘籍,我们一起学习一起进步。 觉得不错的话,也可以阅读其他文章(感谢朋友的鼓励与支持🌹🌹🌹)

开启LeetCode之旅

LeetCode之双指针

Leet27、移除元素

前端工程师必学的经典排序算法

LeetCode20、括号匹配

LeetCode7、整数反转