【Algorithm】二分排序小技巧

TypantK發表於2019-03-04

*先說現象:

在一個整形陣列,

使用二分法找大於整數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));
	}
}

 

相關文章