美文网首页
算法练习24:在排序数组中查找数字 I(leetcode Off

算法练习24:在排序数组中查找数字 I(leetcode Off

作者: miao8862 | 来源:发表于2021-05-11 20:50 被阅读0次

    题目

    统计一个数字在排序数组中出现的次数。

    输入: nums = [5,7,7,8,8,10], target = 8
    输出: 2

    解法1:遍历1次计数

    遍历一次数组,如果有target则计数+1,结束遍历后输入总计数

    • 时间复杂度:O(n)
    • 空间复杂度:O(1)
    /**
     * @param {number[]} nums
     * @param {number} target
     * @return {number}
     */
    var search = function(nums, target) {
        let res = 0;
        for(let i = 0; i < nums.length; i++) {
            if(nums[i] === target) res++;
        }
        return res;
    };
    

    解法2:使用二分法

    递归2分,每次找到中位数下标(right - left)/2 向下取整 + left,对比中位数和目标数的大小:

    • 如果中位数 > 目标数,则继续递归左半部分的数组
    • 如果中位数 < 目标数,则继续递归查找右半部分数组
    • 如果中位数 = 目标数,则只能分别递归左半部分和右半部分数组
    var search = function(nums, target) {
      if(!nums.length) return 0;
      let res = 0;
      function getNum(left ,right) {
          if(right < left) return;
          if(right === left) {
              if(nums[right] === target) res++;
              return;
          }
          let middle = ((right - left) >> 1) + left
          if(nums[middle] === target) {
            res++;
            getNum(left, middle - 1)
            getNum(middle + 1, right)
          }else if(nums[middle] > target) {
            getNum(left, middle - 1)
          }else {
            getNum(middle + 1, right)
          } 
      }
      getNum(0, nums.length - 1)
      return res;
    };
    
    • 时间复杂度: O(logn),每次都2分,也就是都是/2操作
    • 空间复杂度:O(n/2) => O(n)

    相关文章

      网友评论

          本文标题:算法练习24:在排序数组中查找数字 I(leetcode Off

          本文链接:https://www.haomeiwen.com/subject/sfawdltx.html