拿到手肯定是折半查找,第一次做是直接找到一个位置,然后向前向后搜索其他一样的值,这样的时间复杂度还是不低。
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array.length==0) return 0;
int len=array.length;
int low=0, high=array.length-1;int mid=(high+low)/2;;
while(low<=high){
mid=(high+low)/2;
if(array[mid]==k) break;
else if( array[mid]<k) low=mid+1;
else{ high=mid-1;}
}
if(array[mid]!=k) return 0;
int num=0; int index=mid;mid-=1;
while(index<len&&array[index]==k){ index++;num++; }
while(mid>=0&&array[mid]==k){mid--;num++;}
return num;
}
}
要想达到O(logn)必须分别找出他的最上界 与 最下界,
找上界的方法就是,当array[mid]==k时,end也要等于mid-1这样就会不停的寻找最前面的上界
找下界的方法就是,当array[mid]==k时,start等于mid+1,这样就会不停的寻找最下界
//由于数组有序,所以使用二分查找方法定位k的第一次出现位置和最后一次出现位置
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int lower = getLower(data,k);
int upper = getUpper(data,k);
return upper - lower + 1;
}
//获取k第一次出现的下标
int getLower(vector<int> data,int k){
int start = 0,end = data.size()-1;
int mid = (start + end)/2;
while(start <= end){
if(data[mid] < k){ //等于的时候 搞end
start = mid + 1;
}else{
end = mid - 1;
}
mid = (start + end)/2;
}
return start;
}
//获取k最后一次出现的下标
int getUpper(vector<int> data,int k){
int start = 0,end = data.size()-1;
int mid = (start + end)/2;
while(start <= end){
if(data[mid] <= k){ //等于的时候 搞start
start = mid + 1;
}else{
end = mid - 1;
}
mid = (start + end)/2;
}
return end;
}
};
小宋身材真不错hhh