题目:统计一个数字在排序数组中出现的次数。
解题思路:使用二分法,找出这个数字第一次出现的位置和最后一次出现的次数,因此得到该数在数组中的出现的次数。
解法一:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int count = 0;
if(array!=null&&array.length>0){
int left = getFirst(array,k,0,array.length-1);
int right = getLast(array,k,0,array.length-1);
if(left>-1&&right>-1){
count = right-left+1;
}
}
return count;
}
private int getLast(int[] array, int k, int i, int j) {
// TODO Auto-generated method stub
if(i>j){
return -1;
}
int mid = (i+j)/2;
if(array[mid]==k){
if((mid<array.length-1&&array[mid+1]!=k)||mid==array.length-1){
return mid;
}else {
i = mid +1;
}
}else if(array[mid]<k) {
i = mid + 1;
}else {
j = mid - 1;
}
return getLast(array, k, i, j);
}
private int getFirst(int[] array, int k, int i, int j) {
// TODO Auto-generated method stub
if(i>j){
return -1;
}
int mid = (i+j)/2;
if(array[mid]==k){
if((mid>0&&array[mid-1]!=k)||mid==0){
return mid;
}else {
j = mid-1;
}
}
else if (array[mid]>k) {
j = mid -1;
}else {
i = mid+1;
}
return getFirst(array, k, i, j);
}
}
解法二:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array==null||array.length<=0){
return 0;
}
if(array.length==1&&array[0]==k){
return 1;
}
int count = 0;
int i = 0;
int j = array.length-1;
int left = i;
int right = j;
boolean flag_left = true;
boolean flag_right = true;
while(j>i){
if(array[j]==k&&flag_left){
left = j;
flag_left = false;
}
if(array[i]==k&&flag_right){
right = i;
flag_right = false;
}
j--;
i++;
}
if(left==right||(flag_left&&flag_right)){
return 0;
}else {
count = left - right +1;
}
return count;
}
}