题目描述
统计一个数字在排序数组中出现的次数
看到这题的第一反应就是暴力求解,当然了,这不失为一种可行的方法,但是大多数情况下,暴力求解会因为速度限制而过不了testcases,所以我们需要进行优化。
而这题里有一个重点,那就是 排序 ,我们就可以立马联想到二分法求解,这样我们的速度就会变成O(nlogn)。
所以这题分三步:
- 二分法找出任何一个等于k的数组元素,记录下他的index
- 根据这个index向前查找所有等于k的元素数量
- 根据这个index向后查找所有等于k的元素数量
具体代码如下:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array.length == 0 || k < array[0] || k > array[array.length-1]){
return 0;
}
int left = 0;
int right = array.length -1;
int count = 0;
int found = 0;
int mid = -1;
while(left < right){
mid = (left+right)/2;
if(array[mid] > k){
right = mid-1;
}else if(array[mid] < k){
left = mid+1;
}else{
count++;
found = mid;
break;
}
}
int prev = mid-1;
int foll = mid+1;
while(prev >= left){
if(array[prev] == k){
count++;
prev--;
}else{
break;
}
}
while(foll <= right){
if(array[foll] == k){
count++;
foll++;
}else{
break;
}
}
return count;
}
}
京公网安备 11010502036488号