*先說現象:
在一個整形數組,
使用二分法找大於整數k的第一個數時,可以用k+0.5來找
同理找等於整數k的第一個數時,可以用k-0.5來找
其實很好理解,二分法找的是插入這個數字的位置,如果這個數字存在,對於他插入到相同數字序列中的哪個位置是不可預知的。
而取在數的中間,得到的值,是這個數應該存在的位置,而佔住這個位置的數以及其之後的數應該往後移(因爲數組沒有這個數字k+0.5或者k-0.5,所以不用考慮相同數字序列中的位置)。
*結論:
二分查找時,要找某個位置,可以用某個位於單位之間的數進行二分查找,這樣就可以找到此數如果存在,應存在的位置。
NK網上面的題
統計一個數字在排序數組中出現的次數。
public int GetNumberOfK(int [] array , int k){
}
答案
看見有序,就知道是二分查找了
因爲是整形數組,所以就可以借用上面的方法
public class Solution {
int GetNumberOfK(int[] data ,int k) {
return biSearch(data, k+0.5) - biSearch(data, k-0.5) ;
}
private int biSearch(int[] data, double num){
int s = 0, e = data.length-1;
while(s <= e){
int mid = (e - s)/2 + s;
if(data[mid] < num)
s = mid + 1;
else if(data[mid] > num)
e = mid - 1;
}
return s;
}
public static void main(String[] args) {
Solution s = new Solution();
int[] a = {1,2,3,3,3,3};
System.out.println(s.GetNumberOfK(a, 3));
}
}