一、题目描述
统计一个数字在排序数组中出现的次数
二、解题思路
方法一、暴力法,遍历一遍数组,记录下k出现的次数,时间复杂度为O(n)
方法二、二分查找法,递归或循环。时间复杂度O(logn)
三、java代码
public class Solution_38 {
/*统计一个数字在排序数组中出现的次数。
*/
//方法一、暴力解法,一个一个遍历再比较,时间复杂度是O(N)
public int GetNumberOfK(int [] array , int k) { //19ms 9300k
if(array == null)
return 0;
int count = 0;
for(int i = 0;i<array.length;i++){
if(array[i]== k ){
count ++;
}
}
return count;
}
//方法二、二分法递归求解,时间复杂度O(logN),求出第一次出现的位置和最后一次出现的位置,再求差即可
public int GetNumberOfK_2(int [] array,int k){ //19ms 9424k
int length = array.length;
if(array == null || length == 0){
return 0;
}
int firstK = getFirstK(array, k, 0, length-1);
int lastK = getLastK(array, k, 0, length-1);
if(firstK!=-1&&lastK!=-1){
return lastK-firstK+1;
}
return 0;
}
//二分法递归获取第一次出现的k的位置
public int getFirstK(int []array,int k,int start,int end){
if(start>end){
return -1;
}
int mid = (start+end) >> 1; //求出中间位置
if(array[mid] > k){
return getFirstK(array, k, start, mid-1);
}else if(array[mid] < k){
return getFirstK(array, k, mid+1, end);
}else if (mid -1 >= 0 && array[mid-1] == k) {
return getFirstK(array, k, start, mid-1);
}else {
return mid;
}
}
//循环获取最后一次k出现的位置
public int getLastK(int []array,int k,int start,int end){
int length = array.length;
int mid = (start+end) >> 1;
while(start <= end){
if(array[mid]>k){
end = mid - 1;
}else if(array[mid]<k){
start = mid + 1;
}else if(mid+1<length && array[mid+1] == k){
start = mid + 1;
}else {
return mid;
}
mid = (start+end) >> 1;
}
return -1;
}
}