統計一個數字在排序數組中出現的次數。
思路一:傳統解法,採用二分查找第一個K和最後一個K;
public class GetNumberOfK {
public static void main(String[] args) {
int array[] = {1,2,3,3,3,3,3};
int k = 3;
int sum = getNumberOfK(array,k);
System.out.println(sum);
}
public static int getNumberOfK(int[] array, int k) {
if(array.length<=0)
return 0;
int lastk = biSearchlast(array,k,0,array.length-1);
int firstk = biSearchFirst(array,k,0,array.length-1);
if(lastk != -1 && firstk != -1)
return lastk - firstk + 1;
return 0;
}
public static int biSearchlast(int[] array, int k, int start, int end) {
int mid = 0;
int length = array.length - 1;
while(start <= end)
{
mid = (start+end)>>1;
if(array[mid] < k)
{
start = mid + 1;
}
else if(array[mid] > k)
{
end = mid - 1;
}
else if(mid+1<=length && array[mid+1]==k){
start = mid + 1;
}else {
return mid;
}
}
return -1;
}
public static int biSearchFirst(int[] array, int k, int start, int end) {
int mid = 0;
while(start <= end){
mid = (end + start)>>1;
if(array[mid] > k)
{
end = mid - 1;
}
else if(array[mid] < k)
{
start = mid + 1;
}
else if(mid - 1 >= 0 && array[mid-1] == k)
{
end = mid - 1;
}
else {
return mid;
}
}
return -1;
}
}
思路二:看到有序,想到二分查找。
因爲data中都是整數,所以可以稍微變一下,不是搜索k的兩個位置,而是搜索k-0.5和k+0.5
這兩個數應該插入的位置,然後相減即可。
public class GetNumberOfK {
public static void main(String[] args) {
int array[] = {1,2,3,3,3,3,3};
int k = 3;
int sum = getNumberOfK(array,k);
System.out.println(sum);
}
public static int getNumberOfK(int[] array, int k) {
if(array.length<=0)
return 0;
return biSearch(array,k+0.5) - biSearch(array,k-0.5);
}
public static int biSearch(int[] array, double d) {
int min = 0;
int max = array.length-1;
int mid = 0;
while(min <= max)
{
mid = (max+min)/2;
if(array[mid] < d)
{
min = mid + 1;
}
else if(array[mid] > d)
{
max = mid - 1;
}
}
return max;
}
}