[leetcode]704.二分查找

Posted 斯卡堡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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代替
  • 尽量别用递归写法,比较耗空间,还容易栈溢出

后记

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

以上是关于[leetcode]704.二分查找的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode Algorithm 704. 二分查找

LeetCode第3天 - 704. 二分查找 | 35. 搜索插入位置

LeetCode.704 二分查找

LeetCode 704 二分查找[二分] HERODING的LeetCode之路

LeetCode 704. 二分查找

算法专题(01)二分查找(01) 简单LeetCode 704