跳至主要內容

数字在升序数组中出现的次数

微信公众号:储凡2023/2/11小于 1 分钟

数字在升序数组中出现的次数

题目链接

题目描述

刷题思路

代码实现

/**
 * 数字在排序数组中出现的次数
 * 难度:中等
 */
export function GetNumberOfK(data, k) {
  // 分两次二分查找,知道重复元素首次和最后一次出现位置,相减就能拿到重复次数了.

  // 左侧二分查找,重复元素第一次出现的索引位置
  const left = leftBinarySearch(data, k)

  // 右侧二分查找,重复元素最后一次出现的索引位置
  const right = rightBinarySearch(data, k)

  console.log(`left:${left}----> right:${right}`)
  return left === -1 && right === -1 ? 0 : right - left + 1
}

/**
 * 右侧二分查找
 */
function rightBinarySearch(data, target) {
  if (!data.length) {
    return -1
  }
  let left = 0
  let right = data.length - 1

  while (left <= right) {
    const mid = left + Math.floor((right - left) / 2)

    if (target === data[mid]) {
      left = mid + 1
    }
    else if (target < data[mid]) {
      // 左侧
      right = mid - 1
    }
    else if (target > data[mid]) {
      // 右侧;
      left = mid + 1
    }
  }

  // left = right+1; 判断出界
  if (right < 0 || data[right] !== target) {
    return -1
  }
  return right
}

/**
 * 左侧二分查找
 */
function leftBinarySearch(data, target) {
  if (!data.length) {
    return -1
  }
  let left = 0
  let right = data.length - 1

  while (left <= right) {
    const mid = left + Math.floor((right - left) / 2)

    if (target === data[mid]) {
      // 左侧收缩
      right = mid - 1
    }
    else if (target < data[mid]) {
      // 左侧
      right = mid - 1
    }
    else if (target > data[mid]) {
      // 右侧;
      left = mid + 1
    }
  }
  // left = right+1; 判断出界
  if (left > data.length || data[left] !== target) {
    return -1
  }
  return left
}

一些建议

更新日志

2024/7/28 10:06
查看所有更新日志
  • c0f2d-refactor: 升级vuepress相关版本,优化项目结构 (#137)
  • 6ff0a-feat(algo): 新增剑指、shell等算法文档
  • 06596-feat: 算法相关文档新增固定链接,优化导入代码配置
  • 9b9e4-feat: 算法相关文档更新,删除讨论链接 (#88)
  • c374b-feat: 更新一些文档的固定链接 (#87)
  • b0275-feat(markdownlint-cli): 添加markdown文档校验,支持lint脚本自动格式化文档
  • 5f1e1-feat: 导航栏、侧边栏内容修改,新增目录对应的文档
  • 02ab1-style: 文档目录调整,修改mdEnhance配置
  • d0347-docs(algorithm): 新增模版格式
  • 74e84-docs(algorithm): 新增一些文档
  • ced18-docs: 更新一些文档,优化导航栏
  • a23ce-refactor: 新增manuscript目录,优化文稿结构
  • 74aa9-docs(algorithm): 新增一些文档
  • 3c22c-refactor: 新增Eslint配置,修改相关代码风格
  • 9bbe9-feat: 修改导航栏结构,添加文档
  • e4c74-feat: 新增算法源码
贡献者: chu fan,Chu Fan,chufan,142vip.cn,mmdapl,chufan443