37.数字在排序数组中出现的次数。(这是一个排序数组可以使用二分查找方法)
import java.util.Arrays;
public class Solution {
public int GetNumberOfK(int [] array , int k) {
Arrays.sort(array);//排序数组
int res=0;
int mid=0;
int low=0,high=array.length-1;
while(low<=high){
mid=(low+high)/2;
if(k==array[mid]){
res++;//先将结果值+1
break;
}
else if(k<array[mid])//说明k值在数组的左半部分
high=mid-1;
else
low=mid+1;
}
//因为有可能有重复的值,所以需要以下代码
for(int i=mid+1;i<array.length;i++){// 以 mid+1为起始向后查找
if(array[i]==k){
res++;
}
else{// 如果不相等了结束循环(数组已经排序了,后面不可能有再相等的了)
break;
}
}
for(int j=mid-1;j>=0;j--){//以mid—1为起始向前查找
if(array[j]==k){
res++;
}
else{
}
}
return res;
}
}
方法2:用二分查找方法定位k的第一次出现位置和最后一次出现位置
import java.util.Arrays;
public class Solution {
public int GetNumberOfK(int [] array , int k) {
Arrays.sort(array);//排序数组
int minindex=array.length;
int maxindex=array.length;
int mid=0;
int begin=0,end=array.length-1;
// 二分查找第一个等于 k 的位置。
while(begin<=end){
mid=(begin+end)/2;
if(k==array[mid]){
minindex=mid;//先将结果值+1
end=mid-1;
}
else if(k<array[mid])//说明k值在数组的左半部分
end=mid-1;
else
begin=mid+1;
}
// 如果没找到 k ,则返回 0。
if(minindex==array.length) return 0;
begin=0;
end=array.length-1;
// 二分查找第一个比k大的位置
while(begin<=end){
mid=(begin+end)/2;
if(array[mid]<=k){
begin=mid+1;
}
else{
maxindex=mid;
end=mid-1;
}
}
return maxindex-minindex;
}
}