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
}
posted @ 2019-12-07 21:13  南方有嘉木1993  阅读(184)  评论(0编辑  收藏  举报