1. 程式人生 > 其它 >704. 二分查詢

704. 二分查詢

題目

題目連結:https://leetcode-cn.com/problems/binary-search/

給定一個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

提示:

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

思路

題目的前提是陣列為有序陣列,而且陣列中無重複元素,是二分法的前提條件。

程式碼

//版本一 左閉右閉區間
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1; // 定義target在左閉右閉的區間裡,[left, right]
while (left <= right) { // 當left==right,區間[left, right]依然有效,所以用 <= int middle = left + ((right - left) / 2);// 防止(left + right)溢位 等同於(left + right)/2 if (nums[middle] > target) { right = middle - 1; // target 在左區間,所以[left, middle - 1] } else
if (nums[middle] < target) { left = middle + 1; // target 在右區間,所以[middle + 1, right] } else { // nums[middle] == target return middle; // 陣列中找到目標值,直接返回下標 } } // 未找到目標值 return -1; } };
// 版本二  左閉右開區間
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size(); // 定義target在左閉右開的區間裡,即:[left, right)
        while (left < right) { // 因為left == right的時候,在[left, right)是無效的空間,所以使用 <
            int middle = left + ((right - left) >> 1);
            if (nums[middle] > target) {
                right = middle; // target 在左區間,在[left, middle)中
            } else if (nums[middle] < target) {
                left = middle + 1; // target 在右區間,在[middle + 1, right)中
            } else { // nums[middle] == target
                return middle; // 陣列中找到目標值,直接返回下標
            }
        }
        // 未找到目標值
        return -1;
    }
};