704. 二分查詢
阿新 • • 發佈:2021-08-05
題目
題目連結: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] } elseif (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; } };