返回顶部

[leetcode]704.二分查找

704. 二分查找

Difficulty: 简单

给定一个 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]之间。

Solution 1

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

思路

二分查找针对有序数组,每次选取数组中点进行对比,等于中点直接返回,大于中点则说明在中点右侧,小于中点则说明在左侧。


solution 2

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

思路

递归写法

注意

  • 注意端点,这里采取左闭右开的策略,即右侧端点不被考虑,因此函数传值的时候直接把右侧端点传入即可,不需要减一
  • 注意直接left+right直接相加可能导致整型溢出,因此采用left + (right - left) >> 1代替
  • 尽量别用递归写法,比较耗空间,还容易栈溢出

后记

三鹿蛋的题目,反正我是没想到居然这么简单😔,但是我只写出破绽百出的递归写法,这题刷的太恶心我了

posted @ 2020-07-02 17:35  Swetchine  阅读(123)  评论(0编辑  收藏  举报