1. 程式人生 > >LeetCode-二分查詢的變種總結

LeetCode-二分查詢的變種總結

二分查詢

二分查詢作為一種基礎演算法,在面試和筆試中也是經常遇到,然而這一演算法在不同的情形中也有不同的表現形式,下面是一些二分查詢演算法的變種總結。(以下程式碼均已實現)

時間複雜度:

二分查詢也稱為折半查詢,每次都能將查詢區間減半,這種折半特性的演算法時間複雜度為 O(logN)。

mid的計算:

有兩種計算中值 m 的方式:

  • m = (l + h) / 2
  • m = l + (h - l) / 2

l + h 可能出現加法溢位,最好使用第二種方式。

正常實現:

class Solution{
    public int binarySearch1(int[] nums, int key) { //正常實現
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int m = left + (right - left) / 2;
            if (nums[m] == key) {
                return m;
            } else if (nums[m] > key) {
                right = m - 1;
            } else {
                left = m + 1;
            }
        }
        return -1;
    }
}

查詢第一個與key相等的元素

class Solution{
    public int binarySearch2(int[] nums, int key) { //查詢第一個與key相等的元素
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int m = left + (right - left) / 2;
            if (nums[m] < key) {
                left = m + 1;
            } else {
                right = m;
            }
        }
        return left;
    }
}

查詢最後一個與key相等的元素

class Solution{
    public int binarySearch3(int[] nums, int key) { //查詢最後一個與key相等的元素
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int m = left + (right - left) / 2;
            if (m == left) {
                break;
            }
            if (nums[m] <= key) {
                left = m;
            } else {
                right = m - 1;
            }
        }
        return right;
    }
}

查詢第一個大於key的元素

class Solution{
    public int binarySearch4(int[] nums, int key) { //查詢第一個大於key的元素
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int m = left + (right - left) / 2;
            if (m == left) {
                break;
            }
            if (nums[m] <= key) {
                left = m;
            } else {
                right = m;
            }
        }
        return right;
    }
}

查詢最後一個小於key的元素

class Solution{
    public int binarySearch5(int[] nums, int key) { //查詢最後一個小於key的元素
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int m = left + (right - left) / 2;
            if (m == left) {
                break;
            }
            if (nums[m] < key) {
                left = m;
            } else {
                right = m - 1;
            }
        }
        return right;
    }
}