题目
统计一个数字在升序数组中出现的次数。
思想
初步:用暴力法,直接遍历数组,因为是升序的,从第一个找到该元素开始计数一直到下一元素为止
进阶:用二分法来解决,找到这个元素第一次出现的位置first,和最后一次出现的位置last
代码
初步代码
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array.length == 0)
return 0;
int count = 0;
for(int i = 0;i < array.length;i++)
{
if(array[i] == k)
count++;
if(array[i] > k)
break;
}
return count;
}
}
进阶代码
public class Solution {
public int GetNumberOfK(int [] arr , int k) {
if(arr == null || arr.length == 0) return 0;
int start = getFirst(arr, k, 0, arr.length - 1);
int end = getLast(arr, k, 0, arr.length - 1);
if(start == -1 || end == -1) return 0;
else return end - start + 1;
}
private int getFirst(int arr[], int k, int start, int end){
if(start > end) return -1;
int mid = (start + end) >> 1;
while(start <= end){
if(arr[mid] > k) end = mid - 1;
else if(arr[mid] < k) start = mid + 1;
else if(mid - 1 >= 0 && arr[mid - 1] == k) end = mid - 1;
else return mid;
mid = (start + end) >> 1;
}
if(start > end) return -1;
else return mid;
}
private int getLast(int arr[], int k, int start, int end){
if(start > end) return -1;
int mid = (start + end) >> 1;
while(start <= end){
if(arr[mid] > k) end = mid - 1;
else if(arr[mid] < k) start = mid + 1;
else if(mid + 1 < arr.length && arr[mid + 1] == k) start = mid + 1;
else return mid;
mid = (start + end) >> 1;
}
if(start > end) return -1;
else return mid;
}
}