数组 | LeetCode 704 二分查找

62 阅读1分钟

题目描述

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

本题思路

这道题题目的前提是数组为有序数组且无重复的元素。否则会导致查找的下标不唯一。

左闭右闭

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] > target) {
                right = mid - 1;
            }
            else if (nums[mid] < target) {
                left = mid + 1;
            }
            else return mid;
        }
        return -1;
    }
};

搜索区间为左闭右闭,那么排除的答案就不应该出现在边界及边界以内。

当nums[mid] > target时,nums[left] <= target <= nums[mid-1] < nums[mid]。nums[mid]肯定不等于目标数那么就排除mid所指的数,边界-1则right = mid - 1。

当nums[mid] < target时,nums[mid] < nums[mid+1] <= target <= nums[right]。与上类似。

左闭右开

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size();
        while (left < right) { 
            int mid = left + (right - left) / 2;
            if (nums[mid] > target) { //nums[left] <= targrt < num[mid]
                right = mid;
            }
            else if (nums[mid] < target) {
                left = mid + 1;
            }
            else return mid;
        }
        return -1;
    }
};

搜索区间为左闭右开想把数组中的所有值包含在内就right指针需要+1。

左区间与左闭右闭一样。

当nums[mid] > target时,nums[left] <= targrt < num[mid]。因为搜索区间为左闭右开,本身的区间右边界是不包含在搜索区间内。nums[mid]是排除的答案也就是不应该包含在搜索区间内。如果要是right = mid - 1 反而有可能将答案排除在外所以right = mid