码迷,mamicode.com
首页 > 其他好文 > 详细

[leetcode]704.二分查找

时间:2020-07-02 18:22:27      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:bin   下标   并且   比较   溢出   size   ble   之间   cto   

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.二分查找

标签:bin   下标   并且   比较   溢出   size   ble   之间   cto   

原文地址:https://www.cnblogs.com/Swetchine/p/13225991.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!