统计一个数字在排序数组中出现的次数。
有序数组——二分法
- 考虑到递增和递减两种情况,用一个 flag 来表示,总结起来两个指针的移动有四种情况:
k<array[mid]&&flag==true(即递增)==> index1=mid-1;
k<array[mid]&&flag==false(递减)==> index2=mid+1;
k>array[mid]&&flag==true(递增)==> index2=mid+1;
k>array[mid]&&flag==false(递减)==> index1=mid-1;
发现当 k<array[mid] 和 flag 真假值相同时,index1=mid-1,否则 index2=mid+1。 - 由于 mid 始终不能等于index2,当 index1 和 index2 相邻的时候,mid 需要先判断 array[index2]是否等于k,再返回
public class Solution {
public int GetNumberOfK(int[] array, int k) {
if(array.length==0)
return 0;
boolean flag = array[0] < array[array.length-1];
int index1 = 0;
int index2 = array.length-1;
int count=0;
while(index1<=index2) {
int mid=(index1+index2)/2;
if(k==array[mid]) {
count++;
int c=mid-1;
while(c>=0&&k==array[c--]) {
count++;
}
c=mid+1;
while(c<array.length&&k==array[c++]) {
count++;
}
break;
}else if((k<array[mid])==flag) {
index2=mid-1;
}else if(!(k<array[mid])==flag) {
index1=mid+1;
}else if(mid==index1) {
if(k==array[index2])
return 1;
else
break;
}
}
return count;
}
}