题目描述
统计一个数字在升序数组中出现的次数。
示例1
输入
[1,2,3,3,3,3,4,5],3
返回值
4
考察点:数组;二分
解法1:暴力。如果这个数字出现了,count就加1.
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int len = array.length;
if(len <= 0){
return 0;
}
int count = 0;
for(int i=0;i<len;i++){
if(array[i] == k){
count++;
}
}
return count;
}
}
解法2:看见有序数组,用二分。使用二分查找方法定位k的第一次出现位置和最后一次出现位置
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int len = array.length;
if(len <= 0){
return 0;
}
int start = getStart(array,k);
int end = getEnd(array,k);
return end - start + 1;
}
// 获取第一次出现的位置
public int getStart(int[] array,int k){
int start = 0;
int end = array.length-1;
int mid = (start+end)/2;
while(start<=end){
if(array[mid] >= k){
end = mid - 1;
}else{
start = mid + 1;
}
mid = (start + end)/2;//更新mid位置
}
return start;
}
// 获取最后一次出现的位置
public int getEnd(int[] array,int k){
int start = 0;
int end = array.length-1;
int mid = (start+end)/2;
while(start<=end){
if(array[mid]<=k){
start = mid + 1;
}else{
end = mid - 1;
}
mid = (start + end)/2;
}
return end;
}
}