【二分查找】
创始人
2025-05-30 15:21:16
0

二分查找

  • 704. 二分查找
  • 35. 搜索插入位置
  • 34. 在排序数组中查找元素的第一个和最后一个位置
  • 结语

704. 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

链接: 二分查找

这个题是一个最基础的二分查找题目,需要你写出二分查找最基础的模板出来。
二分查找有许多的边界问题,每一次边界的处理都要坚持根据区间的定义来操作
,这就是循环不变量规则。

由题可知,该数组是一个升序的有序整型数组,
在这里插入图片描述
定义一个l变量,一个r变量,一个mid,分别表示的左值,右值,中值。
然后对每一次的mid中值进行一次check,当循环正常结束就是没有target值,
返回-1.

代码:

int search(int* nums, int numsSize, int target){int left=0,right=numsSize-1;int mid=(left+right)/2;while(leftif(nums[mid]>=target){right=mid;}else left=mid+1;mid=(left+right)/2;}if(nums[left]==target)return left;return -1;}

35. 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

输入: nums = [1,3,5,6], target = 5
输出: 2

输入: nums = [1,3,5,6], target = 2
输出: 1

输入: nums = [1,3,5,6], target = 7
输出: 4

链接: 搜索插入位置

这道题是二分查找的稍微进阶,相较于上一题需要考虑边界情况,
以及最后的返回值。

将上一题的代码拷贝下来


while(left<=right)
{if(nums[mid]==target){return mid;}if(nums[mid]>target){right=mid-1;}if(nums[mid]left=mid+1;}mid=(left+right)/2;

这是部分代码,从题中可知,
如果在遍历的时候找到与target对应的值,那么可以直接返回此时的下标mid
如果没有找到的话,循环结束后l,r,mid,这三个下标哪个是正确的返回值呢。

由题意得,返回的是按照值大小顺序插入的位置,所以返回了l的下标。

代码:

int searchInsert(int* nums, int numsSize, int target){int right =numsSize-1;int left=0;int mid=(right+left)/2;while(left<=right){if(nums[mid]==target){return mid;}if(nums[mid]>target){right=mid-1;}if(nums[mid]left=mid+1;}mid=(left+right)/2;}return left;}

34. 在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

链接: 在排序数组中查找元素的第一个和最后一个位置

解题思路:
1.题目要求找出等于target大小的数组元素下标的开始位置和结束位置。
2.也就说需要进行两次二分查找,一次找出开始位置,一次找出结束位置
3.找出开始位置:

  1. 当数组中有target元素的时候,我们可以将其分为两个部分
  2. 第一个部分范围为所有 小于target的值
  3. 第二部分则为所有 大于等于target的值
  4. 由此可知,第二部分的开头位置的下标即为所求

代码:

        int l = 0;int r = nums.size() - 1;int mid = (l + r) / 2;while (l < r){if (nums[mid] >= target){r = mid;}else{l = mid + 1;}mid = (l + r) / 2;}

4.找出结束位置下标:(同上)

  1. 当数组中有target元素的时候,我们可以将其分为两个部分
  2. 第一个部分范围为所有 小于等于target的值
  3. 第二部分则为所有 大于target的值
  4. 由此可知,第一部分的结束位置的下标即为所求

注意: 此时随着循环更新的是l的值,所以更新方式应改变。mid=(l+r+1)/2
代码:

l = 0;
r = nums.size() - 1;
mid = (l + r+ 1) / 2;
while (l < r)
{if (nums[mid] <= target){l = mid;}else{r = mid - 1;}mid = (r + l+ 1) / 2;
}

每次求出也要检查所求下标对应的值是否为target。

代码:

class Solution {
public:vector searchRange(vector& nums, int target) {vector ans;//特殊情况处理if(nums.size()==0){ans.push_back(-1);ans.push_back(-1);return ans;}//初始位置int l = 0;int r = nums.size() - 1;int mid = (l + r) / 2;while (l < r){if (nums[mid] >= target){r = mid;}else{l = mid + 1;}mid = (l + r) / 2;}if (nums[l] == target) ans.push_back(l);else ans.push_back(-1);//结束位置l = 0;r = nums.size() - 1;mid = (l + r+ 1) / 2;while (l < r){if (nums[mid] <= target){l = mid;}else{r = mid - 1;}mid = (r + l+ 1) / 2;}if (nums[r] == target) ans.push_back(r);else ans.push_back(-1);return ans;}
};

结语

本期的二分查找到此结束,希望对各位有所帮助

我是Tom-猫
如果觉得有帮助的话,记得
一键三连哦ヾ(≧▽≦*)o。
在这里插入图片描述

相关内容

热门资讯

《Spring Boot 趣味... 斗转星移,无人能及——Spring MVC Spring MVC 简介 MVC 模式是...
熟悉常用的 Linux 操作和... 文章目录前言一、常用命令集合1、cd命令:切换目录1、切换到目录/usr/local2...
文旅盛宴引客来!“中国李乡”信... 盛夏来袭,茂名信宜市三华李大批量成熟上市。5月30日,信宜文旅品牌“530享李季”盛大开启,系列活动...
爱上海|帕梅拉上海过端午 传统... 著名健身博主帕梅拉在上海黄浦过端午。她与上海脱口秀演员Norah一起逛了豫园、和平饭店等地标性景点。...
idea 中项目解除svn关联... 项目svn解除管理 通过File-> Settings进入   打开Plugins -> 搜索SV...
语义化标签 让标签有自己得含义常见的语义化标签 :定义在页眉:定义导航链接部分,一般...
Ubuntu系统与Linux常... 目录一、Ubuntu系统:1. Ubuntu目录的简介2. Ubuntu与人交互3. ...
【标准的产品解决方案】Soft...  Softerra为IT行业 提供标准产品和解决方案 以及从头开始研发定制软件 以及物联网、定制芯片...
粽香四溢,情满泗县!看泗县人如... 美好泗县 端午节 这个承载着千年文化的传统节日 在泗县的大街小巷 焕发出新的活力 泗县人用丰富多彩...
四川旺苍:烟火夜市“热辣”出圈 选菜、下锅、涮烫、出锅……辣椒油一淋、芝麻一撒,每一步都恰到好处。端午假期,广元市旺苍县红军城红场夜...
中新健康|品味传统粽香,守护健... 今天是端午节,传统美食——粽子成为餐桌主角。如何健康享用这份节令美食?不同时段食用有何讲究?哪些人群...
江南乌饭粽频获香港食客青睐 中新社金华5月31日电 (董易鑫)5月31日是端午节。“今年乌饭火腿粽在香港的销量依旧很好,月初已经...
从街区到小镇 邯郸多场景解码文... 来源:中国新闻网中新网邯郸5月31日电 题:从街区到小镇 邯郸多场景解码文化“出圈”作者 王夏菲5月...
Vue2与Vue3的区别 目录Vue2与Vue3的区别性能开发体验代码大小响应式系统总结 Vue2与Vue3的区别 Vue是...
去四川旅游攻略自驾游5天4晚一... 四川的多彩魅力 四川旅游推荐!当地导游-乐乐:185 8335 5758(加他微信-立减200)免费...
四川九寨沟峨眉山旅游报团6日游... 标题:亲测四川九寨沟峨眉山6日游,乐乐导游带你领略蜀地风情! 四川旅游推荐!当地导游-乐乐:185 ...
四川九寨沟乐山大佛旅游攻略报团... 标题:四川九寨沟乐山大佛5日游亲测报告,跟着本地团导游乐乐玩转四川! 四川旅游推荐!当地导游-乐乐:...
视频:光热赋能文旅新体验 据邯郸新闻+报道,鲲乐湾国际旅游度假区是国内首个光热新能源与文旅融合的项目。 太阳能通过“光热+”...