数组之排序数组查找出现次数

剑指 Offer 53 - I. 在排序数组中查找数字 I

题目描述

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

示例 1:

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

示例 2:

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

解法一:二分查找

由于数组 nums 中元素都为整数,因此可以分别二分查找 target 和 target - 1 的右边界,将两结果相减并返回即可。

本质上看, helper() 函数旨在查找数字 tar 在数组 nums 中的 插入点 ,且若数组中存在值相同的元素,则插入到这些元素的右边。

var search = function(nums, target) {
  return helper(nums, target) - helper(nums, target - 1);
}
const helper = (arr, tar) => {
  let i = 0, j = arr.length - 1;
  while(i <= j) {
    let mid = Math.floor((i + j) / 2)
    if(arr[mid] <= tar){
      i = mid + 1;
    }else{
      j = mid - 1;
    } 
  }
  return i;
}

解法二:首尾双指针

var search = function(nums, target) {
  if(!nums.length) return 0
  let i = 0, j = nums.length - 1
  while(nums[i] < target){
    i ++
  }
  while(nums[j] > target){
    j --
  }
  return  j - i + 1
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值