首页 > 其他分享 >NO.704二分查找

NO.704二分查找

时间:2022-12-03 14:22:05浏览次数:45  
标签:二分 right target nums mid 数组 查找 搜索 NO.704

问题描述

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

解题思路

二分法是搜索算法中效率较高的一种对有序数组进行搜索的一种。它的主要思想是将待搜索的数组中间元素nums[mid]与需要搜索的目标target进行比较:

如果nums[mid]=target ,则找到目标元素;

如果nums[mid]>target ,则目标元素在mid下标左边,我们可以直接砍掉待搜索数组右半部分,对数组左半部分进行搜索;

如果nums[mid]<target ,则目标元素在mid下标右边,我们可以直接砍掉待搜索数组左半部分,对数组右半部分进行搜索。

该算法的难点为:左右指针(left,right)的定义,判断循环结束条件。

我们采取区间左闭右闭的方式,定义左右指针:left=0,right=len-1。即左右指针初始值为数组首尾元素。

循环判断的方式为while(left<=right)。在这里,因为两跟指针都是闭区间上的,所以两根指针坐标的数组元素都能取到,所以left和right下标的数组元素可以取到,即合法;若right为开区间的指针=len,则right下标的元素不可以取到,该处应为left<right。

在循环体中:

  if(nums[mid]>target) right=mid-1;下一次搜索区域为原数组左半部分。

  if(nums[mid]<target) left=mid+1;下一次搜索区域为原数组右半部分。

  else return mid;

注意:为什么更新边界是mid-1和mid+1呢?因为根据if条件中的判断,mid下标元素不为target,所以把mid从下一次搜索数组中剔除,避免重复多余的操作。

代码实现

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

 

标签:二分,right,target,nums,mid,数组,查找,搜索,NO.704
From: https://www.cnblogs.com/yihong-song/p/16947579.html

相关文章

  • 数据结构 玩转数据结构 6-13 更多二分搜索树相关话题
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13478 1重点关注1.1待解决的问题(持续深进)求某个节点的floor和ceil求某个节点的......
  • 蓝桥杯 ALGO-50算法训练 数组查找及替换
    问题描述给定某整数数组和某一整数b。要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序。如果数组元素数值在A到Z的ASCII之间,替换为对应字母。......
  • golang二分查找算法
    一、条件:一组数据要进行二分查找,那么这个要查找的元素是有序,并且是连续存放(数组)。这样才可以进行二分查找。在数据库主键查找,二分查找算法是底层算法原理。二、下面用golang......
  • hdu棋盘游戏(二分图匹配)
    题目描述ProblemDescription小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限......
  • 一道阿里巴巴面试题--海量数据查找
    题目:面试官问,我们阿里巴巴公司收到了很多简历,比如说是百万级别的简历,你能不能设计一个算法,让我输入一个姓,程序输出所有这个姓的人,比如我输入张,输出是张三,张四等等设计思路: ......
  • 算法之二分查找
    1.二分查找:指的是通过找到中间值,用中间值和需要找的值作比较,在中间值的左右区间来判断需要寻找的值所在的位置。"""coding:utf-8@Software:PyCharm@Time:2022/12/116......
  • 前端基础——CSS(如何查找标签、如何添加样式)
    前端基础——CSS(如何查找标签、如何添加样式)一、CSS样式表/*主要用来调节html标签的各种样式思考:页面都是由HTML构成的并且页面上有很多相同的HTML标签但是相同的H......
  • 二分图判定
    二分图的判定二分图的定义:若无向图\(G\)的所有节点可以划分为两个集合\(A,B\),若\(A,B\)均不为空且不存在一条边\((u,v)\)使得\(u,v\)属于同一集合,则称这个无向图为二分图......
  • wqs 二分
    更应该说是一种思想吧。我们希望知道恰好选择\(k\)个物品时的答案,但世界上哪来的那么多恰好呢。令\(f_x\)是恰好选择\(k\)个物品时的答案,那么点集\((x,f_x)\)常会......
  • 物联网安全——信息泄露 tenda某路由器信息泄露查找 固件信息泄露 检测方式:IPS签名(web
    tenda某路由器信息泄露查找 本文作者:i春秋作家——icqb32d3a261:前期准备:(1)路由器固件一般获取固件的方法有以下几种官方网站根据对应版本下载(√),点击下载......