您的位置:首页 > Web前端

剑指Offer:指定数字在排序数组中出现的次数

2018-02-25 16:26 344 查看
统计指定数字再排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在数组中出现了4次,输出4。

使用二分查找法

由于数组是排序的我们应该很容易想到使用二分法查找指定数字。第一次查找中间值为3,等于我们要查找的数字,其他数字3可能在中间值的两侧,我们要查找到第一个3出现的位置和最后一个3出现的位置。

第一个3出现的位置我们可以这样确定:如果中间值前一个元素不是3,说明中间值就是第一个3;如果前一个元素依旧是3,说明第一个3还在之前,再次使用二分法。最后一个3出现的位置思路相同。

实现代码:

//获取第一个指定元素出现的位置
private static int GetFirstK(int[] arr, int k,int left,int right) {
if(left>right){
return -1;
}
int mid = (left+right)/2;
if(arr[mid]==k){
if(mid>0&&arr[mid-1]!=k||mid==0){
return mid;
}else{
right = mid-1;
}
}else{
if(arr[mid]>k){
right = mid-1;
}else{
left = mid+1;
}
}
return GetFirstK(arr,k,left,right);
}


//获取最后一个指定元素出现的位置
private static int GetLastK(int[] arr, int k, int left, int right) {
if(left>right){
return -1;
}
int mid = (left+right)/2;
if(arr[mid]==k){
if(mid<arr.length-1&&arr[mid+1]!=k||mid==arr.length-1){
return mid;
}else{
left = mid+1;
}
}else{
if(arr[mid]>k){
right = mid-1;
}else{
left = mid+1;
}
}
return GetLastK(arr,k,left,right);
}


//整合
private static int GetCountsOfNum(int[] arr, int k) {
if(arr==null||arr.length==0){
return -1;
}
int first = GetFirstK(arr,k,0,arr.length-1);
int last = GetLastK(arr,k,0,arr.length-1);
if(first>-1&&last>-1){
return last-first+1;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息