題目:
統計一個數字在排序數組中出現的次數。
題目中看到了有序,首先應該想到的是二分查找。但是常規的二分查找用於尋找一個數,該題是用於尋找一個範圍,因爲需要尋找第一個等於目標數的數及最後一個等於目標數的數。
如何尋找第一個等於目標數的數呢?
該數左邊的數不等於目標數。
如何尋找最後一個等於目標數的數呢?
該數右邊的數不等於目標數。
public class Sword034GetNumberOfK {
public int GetNumberOfK(int [] array , int k) {
if(array == null || array.length == 0){
return 0;
}
int start = getFirst(array,k,0,array.length - 1);
int end = getLast(array,k,0,array.length - 1);
if(start != -1 && end != -1){
return end - start + 1;
}
return 0;
}
/**
* 第一個等於k的數
*/
public int getFirst(int[] nums, int k, int start, int end){
int mid = (start + end)/2;
while(start <= end){
if(nums[mid] < k){
start = mid + 1;
}else if(nums[mid] > k){
end = mid-1;
}else{
if(mid - 1 >= 0 && nums[mid-1] == k){
end = mid-1;
}else{
return mid;
}
}
mid = (start + end)/2;
}
return -1;
}
/**
* 最後一個等於k的數
*/
public int getLast(int[] nums, int k, int start, int end){
int mid = (start + end)/2;
while(start <= end){
if(nums[mid] < k){
start = mid + 1;
}else if(nums[mid] > k){
end = mid - 1;
}else{
if( mid + 1 < nums.length && nums[mid+1] == k){
start = mid+1;
}else{
return mid;
}
}
mid = (start + end)/2;
}
return -1;
}
}