Go语言实现:【剑指offer】数字在排序数组中出现的次数

该题目来源于牛客网《剑指offer》专题。

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

看到排序数组,要想到用二分查找。

先找到最前面的数字k,再找到最后面的数字k,通过下标求出次数。

Go语言实现:

func getNumberOfK(num []int, k int) int {
  length := len(num)
  firstK := getFirstK(num, k, 0, length-1)
  lastK := getLastK(num, k, 0, length-1)
  if firstK != -1 && lastK != -1 {
    return lastK - firstK + 1
  }
  return 0
}//递归
func getFirstK(num []int, k int, start int, end int) int {
  if start > end {
    return -1
  }
  mid := (start + end) / 2
  if num[mid] > k {
    return getFirstK(num, k, start, mid-1)
  } else if num[mid] < k {
    return getFirstK(num, k, mid+1, end)
  } else if mid-1 >= 0 && num[mid-1] == k { //mid为k,mid-1也为k
    return getFirstK(num, k, start, mid-1) //找到最前面的K
  } else {
    return mid
  }
}//循环
func getLastK(num []int, k int, start int, end int) int {
  length := len(num)
  mid := (start + end) / 2
  for start <= end {
    if num[mid] > k {
      end = mid - 1
    } else if num[mid] < k {
      start = mid + 1
    } else if mid+1 <= length-1 && num[mid+1] == k { //mid为k,mid+1也为k
      start = mid + 1 //找到最后面的K
    } else {
      return mid
    }
    mid = (start + end) / 2
  }
  return -1
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值