首页 > 编程语言 >算法刷题系列——二分查找

算法刷题系列——二分查找

时间:2023-04-18 21:55:36浏览次数:151  
标签:二分 right target nums int mid 查找 刷题 left

704. 二分查找(2023.4.17)

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

点击查看代码
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)
                return mid;
            else if (nums[mid] < target)
                left = mid + 1;//[mid + 1, right]
            else if (nums[mid] > target)
                right = mid - 1;//[left, mid - 1]
        }
        return -1;
    }
};
# 基础知识 > 几个最常用的二分查找场景:寻找一个数、寻找左侧边界、寻找右侧边界。而且,我们就是要深入细节,比如不等号是否应该带等号,mid 是否应该加一等等。分析这些细节的差异以及出现这些差异的原因,保证你能灵活准确地写出正确的二分查找算法。 ## 二分查找框架
点击查看代码
int binarySearch(int[] nums, int target) {
    int left = 0, right = ...;

    while(...) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            ...
        } else if (nums[mid] < target) {
            left = ...
        } else if (nums[mid] > target) {
            right = ...
        }
    }
    return ...;
}
分析二分查找的一个技巧是:不要出现 else,而是把所有情况用 else if 写清楚,这样可以清楚地展现所有细节。本文都会使用 else if,旨在讲清楚,读者理解后可自行简化。

其中 ... 标记的部分,就是可能出现细节问题的地方,当你见到一个二分查找的代码时,首先注意这几个地方。后文用实例分析这些地方能有什么样的变化。

另外提前说明一下,计算 mid 时需要防止溢出,代码中 left + (right - left) / 2 就和 (left + right) / 2 的结果相同,但是有效防止了 left 和 right 太大,直接相加导致溢出的情况。

相关题目

35.搜索插入位置
34.在排序数组中查找元素的第一个和最后一个位置
69.x 的平方根
367.有效的完全平方数

标签:二分,right,target,nums,int,mid,查找,刷题,left
From: https://www.cnblogs.com/yimumengke/p/17331317.html

相关文章

  • leetcode刷题随笔(1)
     11.盛水最多的容器暴力求解超时问题的解决intmaxArea(vector<int>&height){intmax=0;intn=height.size();intnum;inti,j;for(i=0;i<n;i++)for(j=0;j<n;j++){if(i<j)......
  • 折半查找
    N个有序整数数列已放在一维数组中,利用二分查找法查找整数m在数组中的位置。若找到,则输出其下标值;反之,则输出“Notbefound!”。由于我们将数存入数组当中,我们可以先设置最大值下标和最小值下标,通过下标表示数值,现将要找的数与最中间的数进行比较,若要找的数大,则在最中间的数和最大......
  • 折半查找
    1.问题描述:用二分法查找一段有序数组中的某个整数,输出其下标,如果没找的这输出“Notbefound”2.问题分析:分析问题知这个问题分为三部分:(1)输入N个整数(2)将这N个整数进行排序(3)使用二分法进行查找;3.算法设计:先输入一个整数N,用vector函数来储存这N个整数,用algorithm函数库中的sort()函......
  • day 9 二分查找
     1.输入一组有序数列;2.每次查找序列的中间位置并与目标数比较;3.依据比较缩小数列,直到找到目标数或数列长度为1;4.输出; #include<iostream>usingnamespacestd;intn,t,flag;inta[100];intf(intl,intr){while(l<r){intmid=l+r>>1;if(a[......
  • STATA 遍历查找
    sscinstallelabel,replacesysuseauto,clearused:\statashu\2\cgss2015,clearforeachvofvarlist_all{cap:sdecode`v',replace}usecgss2015-2,replacelocalk=_Nforeachvarofvarlist_all{locala:varlabel`var'//disp&qu......
  • 二分查找
    给定一个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,1......
  • Python3 列表生成式和最近刷题遇到问题
    python3创建二维数组需要用到列表生成式列表生成式即ListComprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。举个例子,要生成list [1,2,3,4,5,6,7,8,9,10]可以用list(range(1,11)):>>>list(range(1,11))[1,2,3,4,5,6,7,8,9,10]......
  • 【LBLD】常数时间删除-查找数组中的任意元素
    常数时间删除-查找数组中的任意元素380.O(1)时间插入、删除和获取随机元素classRandomizedSet{private:vector<int>nums;unordered_map<int,int>num2index;public:RandomizedSet(){srand(time(0));}boolinsert(intval){......
  • 力扣刷题
    1/*TheisBadVersionAPIisdefinedintheparentclassVersionControl.2booleanisBadVersion(intversion);*/34publicclassSolutionextendsVersionControl{5publicintfirstBadVersion(intn){6if(n==0){7......
  • 查找自己农历生日与公历生日在同一天的年份
    #请先使用命令pipinstallsxtwl安装依赖库后,再执行以下脚本importsxtwlymc=["正","二","三","四","五","六","七","八","九","十","冬","腊"]rmc=[&quo......