题目描述
统计一个数字在排序数组中出现的次数。
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array==null||array.length<=0)
return 0;
int first=-1;
int last=-1;
//找到第一次出现的位置
for(int i=0;i<array.length;i++){
if(array[i]==k){
first=i;
break;
}
}
//第一遍查询没有k值直接返回0
if(first==-1)
return 0;
//找到最后一次出现的位置
for(int j=array.length-1;j>=0;j--){
if(array[j]==k){
last=j;
break;
}
}
return (last-first+1);
}
}
解法一:时间复杂度O(n)
public class Solution {
public int GetNumberOfK(int [] nums , int k) {
if(nums==null ||nums.length<=0)
return 0;
int len=nums.length;
//只有一个数
if(len==1){
if(nums[0]==k)
return 1;
}
int firstK=0;
int lastK=0;
int i=0;
while(i<len){
if(nums[i]==k){
firstK=i;
break;
}
i++;
}
int j=len-1;
while(j>0){
if(nums[j]==k){
lastK=j;
break;
}
j--;
}
//不存在K
if(lastK==0 &&firstK==0){
return 0;
}
int times=lastK-firstK;
if(times>=0)
return times+1;
return 0;
}
}
解法二:二分查找法,时间复杂度O(logn)
public class Solution {
public int GetNumberOfK(int [] nums , int k) {
if(nums==null||nums.length<=0)
return 0;
int len=nums.length;
int firstK=GetFirstK(nums,0,len-1,k);
int lastK=GetLastK(nums,0,len-1,k);
int times=0;
if(firstK>=0 &&lastK>=0)
times= lastK-firstK+1;
return times;
}
private int GetFirstK(int[]nums,int start,int end,int k){
if(start>end)
return -1;
int midIndex=(end+start)/2;
int midVal=nums[midIndex];
if(midVal==k){
if(((midIndex>0 &&nums[midIndex-1]!=k))||midIndex==0){
return midIndex;
}else{
end=midIndex-1;
}
}else if(midVal>k){
end=midIndex-1;
}else{
start=midIndex+1;
}
return GetFirstK(nums,start,end,k);
}
private int GetLastK(int[]nums,int start,int end,int k){
if(start>end)
return -1;
int midIndex=(end+start)/2;
int midVal=nums[midIndex];
if(midVal==k){
if(((midIndex<nums.length-1 &&nums[midIndex+1]!=k))||midIndex==nums.length-1){
return midIndex;
}else{
start=midIndex+1;
}
}else if(midVal>k){
end=midIndex-1;
}else{
start=midIndex+1;
}
return GetLastK(nums,start,end,k);
}
}