题目描述
统计一个数字在升序数组中出现的次数。
分析
两个方法,第一个暴力破解,也就是我们最容易想到的遍历整个数组即可,这样数组长度为n的话,时间复杂度即为O(n),另一个是二分法,因为给定的数组为有序数组。
一、暴力破解
代码如下:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
//常规解法:时间复杂度为O(n)
int count = 0;
for(int i = 0 ; i < array.length ; i++){
if(array[i] == k){
count++;
}
}
return count;
}
}
二、二分法
二分法时间复杂度为O(logn)
2.1 二分法思路1
寻找k出现的上下界
中间过程自己可以试着自己推导一下,印象会更深刻噢。
代码如下:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
// 寻找上界leftBound
int left = 0, right = array.length;
while(left<right){
int mid = (right + left)/2;
if(array[mid]<k) left = mid+1;
else right=mid;
}
int leftBound = left;
// 寻找下界rightBound
left = 0;
right = array.length;
while(left<right){
int mid = (right + left)/2;
if(array[mid]<=k) left = mid+1;
else right = mid;
}
int rightBound = left;
return rightBound-leftBound;
}
}
2.2 二分法思路2
找到第一个出现k的下标后,分别往这个数的左右找还有几个和k相等的数。
代码如下:
import java.util.Arrays;
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int index = Arrays.binarySearch(array,k);
int count = 1;
if(index < 0)
return 0;
//index下标右边是否也有与k相等的数,有则count++
for(int i = index + 1 ; i < array.length;i++){
if(array[i] == k)
count ++;
else
break;
}
//index下标左边是否也有与k相等的数,有则count++
for(int j = index - 1;j >= 0 ;j--){
if(array[j] == k)
count ++;
else
break;
}
return count;
}
}