题目描述
统计一个数字在升序数组中出现的次数。
示例1
输入
[1,2,3,3,3,3,4,5],3
返回值
4
解题思路
二分查找算法的变形
先找出中间坐标mid,判断array[mid]与key的大小
array[mid]>key:再去左边找
array[mid]<key:再去右边找
重点分析array[mid]=key的情况
这种情况下:它的左边和右边都有可能等于key的值
他们我们依次让左边坐标加一和右边坐标减一。直到左边和右边的元素都等于key。此时就可以利用下标直接计算出一共多少个key
要注意的特殊情况有两种:
如果数组长度为0,则返回0
当我们没找到元素时,也要返回0.要最后返回时分开考虑
java代码实现
10ms 9688kb
public class Solution { public int GetNumberOfK(int [] array , int k) { if(array.length==0) return 0;//数组为空,直接返回 int left=0; int right=array.length-1; while(left<right){ int mid=left+(right-left)/2; if(array[mid]<k){ left=mid+1;//去右边找 } else if(array[mid]>k){ right=mid-1;//去左边找 } else{ if(array[left]<k) left++;//左下标右移 if(array[right]>k) right--;//右下标左移 if(array[left]==k && array[right]==k) break;//全部是key是退出循环 } } if(array[left]==k){//确认全部是key的情况,否则就是没找到返回0 return right-left+1; } return 0; } }