Java两种思路实现:给定一个有序数组,统计指定元素出现的次数
1、直接遍历数组比较统计
时间复杂度为O(N)
/**
* 直接遍历数组比较统计 O(N)
* @param sortArr
* @param num
* @return
*/
public static int countNum(int[] sortArr, int num){
int count = 0;
for (int i = 0; i < sortArr.length; i++) {
if(sortArr[i] == num){
count++;
}
}
return count;
}
2、利用二分查找思想
时间复杂度O(logN)
/**
* 利用二分查找思想
* @param sortArr
* @param num
* @return
*/
public static int countNumByBinary(int[] sortArr, int num){
if(sortArr.length == 0){
return 0;
}
//找出该元素第一次出现的位置
int pos = binarySearch(sortArr,0,sortArr.length-1,num);
if(pos == -1){
return 0;
}
//从该元素第一次出现的位置开始,分别从前和后开始查找该元素
int count = 0;
for (int i = pos; i > 0 && sortArr[i] == num; i--) {
count++;
}
for (int i = pos + 1; i < sortArr.length && sortArr[i] == num; i++) {
count++;
}
return count;
}
/**
* 二分查找
* @param arrSort
* @param start
* @param end
* @param num
* @return
*/
public static int binarySearch(int[] arrSort,int start,int end,int num){
if(start > end || (start==end && arrSort[start] != num)){
return -1;
}
int mid = (start + end)/2;
if(arrSort[mid] > num){
binarySearch(arrSort,start,mid-1,num);
}else if(arrSort[mid] < num){
binarySearch(arrSort,mid+1,end,num);
}else {
return mid;
}
return -1;
}