1-陣列-11-二分查詢-LeetCode704

CodeZeng1998發表於2024-05-24

1-陣列-11-二分查詢-LeetCode704

參考:程式碼隨想錄

LeetCode:題目序號35

更多內容歡迎關注我(持續更新中,歡迎Star✨)

Github:CodeZeng1998/Java-Developer-Work-Note

技術公眾號:CodeZeng1998(純純技術文)

生活公眾號:好鍋(Life is more than code)

部落格園: CodeZeng1998

其他平臺:CodeZeng1998好鍋

題目描述:

給定一個 n 個元素有序的(升序)整型陣列 nums 和一個目標值 target ,寫一個函式搜尋 nums 中的 target,如果目標值存在返回下標,否則返回 -1

示例 1:

輸入: nums = [-1,0,3,5,9,12], target = 9
輸出: 4
解釋: 9 出現在 nums 中並且下標為 4

示例 2:

輸入: nums = [-1,0,3,5,9,12], target = 2
輸出: -1
解釋: 2 不存在 nums 中因此返回 -1

提示:

  1. 你可以假設 nums 中的所有元素是不重複的。
  2. n 將在 [1, 10000]之間。
  3. nums 的每個元素都將在 [-9999, 9999]之間。

二分查詢(左閉右閉)

    /**
     * 二分查詢(左閉右閉)
     *
     * @param nums 升序排序的陣列
     * @param target 目標值
     * @return 陣列索引,如果未找到則返回 -1
     * @Author: CodeZeng1998
     */
    public int binarySearch(int[] nums, int target) {

        if (target < nums[0] || target > nums[nums.length - 1]) {
            return -1;
        }

        int left = 0;
        int right = nums.length - 1;

        while (left <= right) {
            // 當 left、right為較大整數時可能出現溢位,防止溢位,等同於(left + right)/2
            int middle = left + ((right - left) >> 1);

            if (nums[middle] > target) {
                right = middle - 1;
            } else if (nums[middle] < target) {
                left = middle + 1;
            } else {
                return middle;
            }
        }

        return -1;
    }

ChatGPT:

這段程式碼實現了一個二分查詢演算法,用於在升序排序的陣列中查詢目標值。以下是程式碼的解釋:

  • nums:升序排序的整數陣列。
  • target:要查詢的目標值。
  • 方法返回目標值在陣列中的索引,如果未找到則返回 -1。

演算法步驟如下:

  1. 首先,檢查目標值是否小於陣列的第一個元素或大於陣列的最後一個元素,如果是,則返回 -1,因為目標值不可能存在於陣列中。
  2. 使用兩個指標 leftright 分別指向陣列的開頭和結尾。
  3. 進入迴圈,當 left 小於等於 right 時進行查詢。
  4. 計算中間索引 middle,採用了防止整數溢位的方式計算,即 left + ((right - left) >> 1)
  5. 如果 nums[middle] 大於目標值 target,則更新 rightmiddle - 1,因為目標值可能在左半部分。
  6. 如果 nums[middle] 小於目標值 target,則更新 leftmiddle + 1,因為目標值可能在右半部分。
  7. 如果 nums[middle] 等於目標值 target,則直接返回 middle,表示找到了目標值的索引。
  8. 如果迴圈結束仍未找到目標值,則返回 -1,表示未找到目標值。

這個演算法的時間複雜度為 O(log n),其中 n 是陣列的長度,因為每次查詢都將搜尋範圍減半。

二分查詢(左閉右開)

    /**
     * 二分查詢(左閉右開)
     *
     * @param nums 升序排序的陣列
     * @param target 目標值
     * @return 陣列索引,如果未找到則返回 -1
     * @author CodeZeng1998
     */
    public int binarySearch(int[] nums, int target) {
        int left = 0;
        // 定義target在左閉右開的區間裡,即:[left, right)
        int right = nums.length;

        // 因為left == right的時候,在[left, right)是無效的空間,所以使用 <
        while (left < right) {
            // 當 left、right為較大整數時可能出現溢位,防止溢位,等同於(left + right)/2
            int middle = left + ((right - left) >> 1);

            if (nums[middle] > target) {
                right = middle;
            } else if (nums[middle] < target) {
                left = middle + 1;
            } else {
                return middle;
            }
        }

        return -1;
    }

GhatGPT:

這段程式碼實現了一個二分查詢演算法,與之前的程式碼相比,不同之處在於區間的定義是左閉右開的 [left, right),而不是左閉右閉的 [left, right]。以下是程式碼的解釋:

  • nums:升序排序的整數陣列。
  • target:要查詢的目標值。
  • 方法返回目標值在陣列中的索引,如果未找到則返回 -1。

演算法步驟如下:

  1. 定義兩個指標 leftright,分別指向陣列的開頭和結尾(但是 right 指向的是無效的位置,即陣列最後一個元素的下一個位置)。
  2. 進入迴圈,當 left 小於 right 時進行查詢。
  3. 計算中間索引 middle,採用了防止整數溢位的方式計算,即 left + ((right - left) >> 1)
  4. 如果 nums[middle] 大於目標值 target,則更新 rightmiddle,因為目標值可能在左半部分,但是 middle 不包含在搜尋範圍內。
  5. 如果 nums[middle] 小於目標值 target,則更新 leftmiddle + 1,因為目標值可能在右半部分。
  6. 如果 nums[middle] 等於目標值 target,則直接返回 middle,表示找到了目標值的索引。
  7. 如果迴圈結束仍未找到目標值,則返回 -1,表示未找到目標值。

這個演算法與之前的演算法相比,在終止條件和區間的定義上有所不同,但是原理和時間複雜度仍然是相同的,都是 O(log n)。

Given an array of integers nums which is sorted in ascending order, and an integer target, write a function to search target in nums. If target exists, then return its index. Otherwise, return -1.

You must write an algorithm with O(log n) runtime complexity.

Example 1:

Input: nums = [-1,0,3,5,9,12], target = 9
Output: 4
Explanation: 9 exists in nums and its index is 4

Example 2:

Input: nums = [-1,0,3,5,9,12], target = 2
Output: -1
Explanation: 2 does not exist in nums so return -1

Constraints:

  • 1 <= nums.length <= 104
  • -104 < nums[i], target < 104
  • All the integers in nums are unique.
  • nums is sorted in ascending order.

更多內容歡迎關注我(持續更新中,歡迎Star✨)

Github:CodeZeng1998/Java-Developer-Work-Note

技術公眾號:CodeZeng1998(純純技術文)

生活公眾號:好鍋(Life is more than code)

部落格園: CodeZeng1998

其他平臺:CodeZeng1998好鍋

相關文章