题目描述
统计一个数字在排序数组中出现的次数。
package 秋招刷题.剑指offer_链表;
//有序序列,就使用二分查找的思路。一开始的思路是先使用二分法找到k,
// 然后从k开始向两边统计k的个数,但统计的这个时间复杂度达到了O(n),
// 导致整个算法的复杂度O(nlogn),而通过两次二分查找,分别找到第一个k和第一个k+1
// 可以使时间复杂度减少为O(logn)
public class 数字在排序数组中出现的次数 {
public static void main(String[] args) {
int [] a = {1,2,3,5,5,6};
System.out.println(GetNumberOfK2(a , 5));
}
public int GetNumberOfK(int [] array , int k) {
int num = 0;
for (int i = 0 ;i<array.length;i++) {
if (array[i] == k){
num++;
}
}
return num;
}
public static int GetNumberOfK2(int [] array , int k) {
int first = binarySearch(array, k);
int last = binarySearch(array, k + 1);
// return last - first; 牛客网上也可以通过
return ( first == array.length || array[first] != k)? 0 : last - first;
}
public static int binarySearch(int [] array , int k) {
int head = 0;
int tail = array.length;
while (head < tail) {
int middle = head + (tail - head)/2;
if ( k <= array[middle]) {
tail = middle; //如果k在左边,这里要小于等于
}else {
head = middle + 1;
}
}
return head;
}
}