1. 程式人生 > 其它 >力扣 704題 二分查詢(熟悉又陌生的二分查詢)

力扣 704題 二分查詢(熟悉又陌生的二分查詢)

Question 704-binary search

解題思路

其實,二分法查詢這一老掉牙的演算法看上去已經沒有什麼科普的必要了,但是,當不少人實際用起來的時候,卻總對這一演算法抱有這樣那樣的疑惑。比如:

  1. 中間值究竟怎麼取?
  2. 查詢的區間應該包括邊界嗎?
  3. 我老是害怕因為邊界值的取值問題導致漏掉了想查詢的值怎麼辦?

其實,要解決以上 3 點疑惑,只需要記住一個事實:邊界其實取為開區間,也可以為閉區間,只要牢記二分查詢的思想。中間值的地址既可以是(左邊界的地址值 + 右邊界的地址值)/ 2 的向上取整,也可以是向下取整。這些東西其實對演算法本身並沒有影響。

但是,從遵從程式設計師本能的角度出發,你可以聽取我的一點小建議:

  1. 區間應該是左開右閉的

  2. 為了始終維護條件 1,在迴圈查詢的過程中,中間值地址如果賦給左邊界,那麼應該是向上取整。而如果是賦給右邊界,則應該向下取整。

  3. 嚴謹考慮,大膽心細,不用前怕狼後怕虎。

程式碼

class Solution {
    public int search(int[] nums, int target) {

        int head = 0, tail = nums.length;

        while (head < tail) {
            
            int mid = (head + tail) >> 1;

            if (nums[mid] < target) {

                head = mid + 1;
            } else if (nums[mid] > target) {

                tail = mid;
            } else {

                return mid;
            }
        }

        return -1;
    }
}