二分查找----4.搜索旋转排序数组

leetcode-hot100-11二分查找 给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1, -1]。你必须设计并实现时间复杂度为O(log n)的算法解决此问题。输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]思路:用两次二分查找,第一次找出第一个等于 target 的元素的位置,第二次找出最后一个等于 target 的元素的位置。 阅读详情

题目链接

/**

        升序数组在某个位置被分割为前后两部分,前后两部分整体互换;在被改变后的数组中找到目标值

        O(log n)---> 二分查找

        特点:

            旋转后的数组被分割为两个独立的递增区间

            左半区的最小值,大于右半区的最大值(mid所在区间的判断依据)

        二分策略:

            首先判断mid落在左区间还是右区间,其次判断target是否在端点到mid之间

            若target是在端点到mid之间,则可以确定target所在的半区,此时进行常规二分即可

            若target不在端点到mid之间,则无法具体确定其是在mid所在半区的剩余部分,还是另一个半区

            此时迭代left或right,淘汰无效部分,重新计算mid重复上述流程,直到搜寻结束或搜寻到target为止

        判断条件细化:

            mid所在区间:

                    nums[left] <= nums[mid]---> mid必定在左半区,反之在右半区; 依据:左半区的最小值,大于右半区的最大值

            target所在区间:

                    若mid在左半区:nums[left] < target && target < nums[mid]--->target与mid同在左半区,继续常规二分即可

                    若mid在右半区:nums[mid] < target && target < nums[right]--->target与mid同在右半区,继续常规二分即可

                    若表达式不成立,则无法确定target所在半区,则淘汰无效部分重新判断

            注意事项:

                    由于未真正找到数组两半区如何划分,当target所在分区确定后,原本判断target所处独立分区的代码功能会退化为常规二分,稍显冗余无法避免

*/

class Solution {
    /**
        升序数组在某个位置被分割为前后两部分,前后两部分整体互换;在被改变后的数组中找到目标值
        O(log n)---> 二分查找
        特点:
            旋转后的数组被分割为两个独立的递增区间
            左半区的最小值,大于右半区的最大值(mid所在区间的判断依据)
        二分策略:
            首先判断mid落在左区间还是右区间,其次判断target是否在端点到mid之间
            若target是在端点到mid之间,则可以确定target所在的半区,此时进行常规二分即可
            若target不在端点到mid之间,则无法具体确定其是在mid所在半区的剩余部分,还是另一个半区
            此时迭代left或right,淘汰无效部分,重新计算mid重复上述流程,直到搜寻结束或搜寻到target为止
        判断条件细化:
            mid所在区间:
                    nums[left] <= nums[mid]---> mid必定在左半区,反之在右半区; 依据:左半区的最小值,大于右半区的最大值
            target所在区间:
                    若mid在左半区:nums[left] < target && target < nums[mid]--->target与mid同在左半区,继续常规二分即可
                    若mid在右半区:nums[mid] < target && target < nums[right]--->target与mid同在右半区,继续常规二分即可
                    若表达式不成立,则无法确定target所在半区,则淘汰无效部分重新判断
            注意事项:
                    由于未真正找到数组两半区如何划分,当target所在分区确定后,原本判断target所处独立分区的代码功能会退化为常规二分,稍显冗余无法避免
    */
    public int search(int[] nums, int target) {
        //双指针置于有效部分两端
        int left = 0, right = nums.length - 1;
        
        while(left <= right) {
            int mid = (left + right) >>> 1;

            //找到目标值
            if(target == nums[mid]) {
                return mid;
            }

            //判断mid所在区间
            if(nums[left] <= nums[mid]) { //mid在左半区
                //判断target所在区间
                if(nums[left] <= target && target < nums[mid]) { //target必定在左半区
                    right = mid - 1; //淘汰无效部分,后续为常规二分
                } else { //无法确定target所在半区
                    left = mid + 1; //淘汰无效部分,重新判断(不在 left -> mid之间)
                }
            } else { //mid在右半区
                if(nums[mid] < target && target <= nums[right]) { //target必定在右半区
                    left = mid + 1; //淘汰无效部分,后续为常规二分
                } else { //无法确定target所在分区
                    right = mid - 1; //淘汰无效部分,重新判断(不在 mid -> right之间)
                }
            }
        }
        return -1;
    }
}

【忍者算法】探秘旋转数组:二分查找的华丽转身!|LeetCode 33「搜索旋转排序数组」 大家好,我是忍者算法。今天要和大家分享一道特别有趣的题目 - LeetCode 33「搜索旋转排序数组」。这道题巧妙地将二分查找与旋转数组结合,是一道考察思维灵活性的经典题目。想象你在看一个圆形时钟,如果把时钟的12点位置当作起点,顺时针记录1到12这些数字,这就是一个有序序列。现在,如果我们把时钟的指针从8点开始读数,到12点,再到7点,实际上就形成了一个"旋转"后的有序序列:8,9,10,11,12,1,2,3,4,5,6,7。这正是我们今天要处理的"旋转排序数组"!题目要求: 给你一个整数数组 num 阅读详情

相关推荐

Leetcode 81. 搜索旋转排序数组 II

已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4] 。 给你.

我不是码农的博客~~~ 376

二分查找4 - 搜索旋转排序数组

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

花开花落夏的博客 394

CANoe LIN一致性测试之干扰测试Test moudle_LIN Disturbance Block

注意:相邻两个显隐性不同的bit不允许干扰,例如我同时选择bit6和bit7,相邻两个同显隐性的bit允许干扰,例如当我选择bit3和bit4,项,这里我选择ID:为0x2F(PID:0x6F)的frame。需按照具体测试规范实施干扰项,帧头和数据段都可以实现干扰。最近发现一个干扰测试模块,下面是一些具体使用方法。选择干扰项:PID的奇偶校验位(一致性测试干扰测试之手动测试。一个待测试frameD。

yuanyikangkang的博客 3412

刷题记录 HOT100 二分查找-4:33. 搜索旋转排序数组

难度:中等整数数组nums按升序排列,数组中的值。在传递给函数之前,nums在预先未知的某个下标k)上进行了,使数组变为(下标计数)。例如,在下标3处经旋转后可能变为。给你的数组nums和一个整数target,如果nums中存在这个目标值target,则返回它的下标,否则返回-1。你必须设计一个时间复杂度为O(log n)的算法解决此问题。

weixin_44610684的博客 644

液晶电视维修必看:TCON逻辑板故障排查全指南(附常见问题解决方案)

本文详细解析了液晶电视TCON逻辑板的工作原理与故障排查方法,涵盖LVDS信号处理、DC-DC电压系统等核心知识。提供从基础测量到高级维修的完整指南,帮助技术人员快速诊断黑屏、竖线等常见故障,并给出预防性维护建议,提升维修效率与成功率。

weixin_42535461的博客 616

COMSOL 6.4安装全攻略:安装包获取、许可证配置与避坑指南

多物理场仿真是现代工程与科研中不可或缺的技术手段,其核心原理在于将电磁、结构、流体、传热等不同物理过程的耦合效应置于统一环境中求解,从而真实模拟复杂系统行为。这类仿真平台能大幅提升产品研发与设计验证效率,广泛应用于电子散热、声学分析、电力设备等领域。在部署最新版本仿真软件时,安装与许可证配置往往成为影响工作效率的关键环节。本文系统梳理COMSOL 6.4在Windows平台的安装全流程,涵盖安装包获取、系统依赖准备、许可证配置、常见报错排查等实用经验,帮助工程师与科研人员一次性完成环境搭建,把更多时间投入真

weixin_30000735的博客 1365

面试经典 150 题 4 —(二分查找)— 33. 搜索旋转排序数组

【代码】面试经典 150 题 4 —(二分查找)— 33. 搜索旋转排序数组。

BreezeChasingDrizzle 479

用OpenNI2获取奥比中光Astra Pro及 Astra Pro SM输出的深度图(win,linux arm64 x64平台)

搞了一个奥比中光Astra Pro,想在windows平台,和linux rk3588 上获取深度信息,之前的驱动下载已经不好用了。

babytiger的专栏 1306

6-4 【要再回来强化二分查找!】LC33 搜索旋转排序数组 Java力扣刷题笔记

高频面试题~字节校园每日一题 LC33 搜索旋转排序数组 暴力解法大胜利系列 然后正规方法是二分查找

一碗菜粥的博客 239

在Cursor中集成Ollama与Qwen2.5‑Coder:零成本本地AI开发环境搭建

本文详细介绍了如何零成本搭建本地AI开发环境,通过将Cursor IDE与本地运行的Ollama及Qwen2.5-Coder模型集成,实现数据不出本地的智能编程辅助。教程涵盖Ollama安装、模型拉取、ngrok内网穿透配置及Cursor设置等核心步骤,并提供了实战测试与常见问题排错指南,为注重隐私与成本的开发者提供安全高效的解决方案。

weixin_29296241的博客 1073

OpenCV C++ 图像处理实战 ——《基于轮廓比对的缺陷检测》

本文使用OpenCV C++ 实现基于轮廓比对的缺陷检测。

Zero___Chen的博客 1150

LeetCode刷题日记2021-4-7/81. 搜索旋转排序数组II/二分查找法

仅供自己学习记录 LeetCode刷题日记2021-4-7 题目描述: 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处

qq_39225746的博客 172

华为OD机试 - 第k个排列 - 全排列递归(Python/JS/C/C++ 2025 C卷 100分)

给定参数n,从1到n会有n个整数:1,2,3,…,n,这n个数字共有n!按大小顺序升序列出所有排列的情况,并一一标记当n=3时,所有排列如下“123”,“132,“213”,“231”,“312”,“321”输入两行,第一行为n,第二行为k,给定n的范围是[1,9],给定k的范围是[1,n!排列为“12”和“21”,第2个是“21”。给定n和k,返回第k个排列。输出排在第k位置的数字。只有一个排列,直接返回。

学Java,找哪吒 987

LeetCode 热题 100 之 33. 搜索旋转排序数组 153. 寻找旋转排序数组中的最小值 4. 寻找两个正序数组的中位数

本文总结了三种基于二分查找的经典数组问题解法:1. 搜索旋转排序数组(LeetCode 33):通过判断左右半区有序性,利用target与有序区间的关系缩小查找范围。2. 寻找旋转数组最小值(LeetCode 153):比较mid和right值,最小值总是出现在无序半区,最终收敛于left=right处。3. 寻找两个正序数组中位数(LeetCode 4):提供二分查找和顺序枚举两种解法,核心都是找到满足左半最大值≤右半最小值的分割点。关键技巧包括:处理旋转数组的有序区间判定、中位数分割点的数学特性应用、边

2401_87662859的博客 520

H3LIS200DL三轴加速度传感器原理图设计,已量产(加速度传感器)

在最近的工业振动监测项目里,我们选了 ST 的 H3LIS200DL 做核心传感器 —— 这颗料的特点太契合场景了:±100g/200g 的大量程刚好覆盖设备冲击与振动的测量需求,10μA 的超低功耗能适配电池供电的边缘节点,0.5Hz 到 1kHz 的输出速率也足够抓准动态信号。下面结合实际画的原理图,拆解下这个硬件电路的设计思路。

不脱发的程序猿 338

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【LeetCode 热题100】搜索旋转排序数组(力扣33 / 81/ 153/154)(Go语言版)

本文深入探讨了LeetCode中四道关于「搜索旋转排序数组」的经典题目,涵盖了无重复和有重复元素的情况。通过二分查找的变形应用,文章详细解析了每道题的解题思路和Go语言实现代码。关键点包括判断有序区间、处理重复元素以及如何缩小搜索范围。文章还总结了各题的异同,并推荐了类似题目,帮助读者全面掌握二分查找在旋转数组中的应用。无论是初学者还是有经验的开发者,都能从中获得实用的解题技巧和代码实现方法。

小韩的博客 766

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

leetcode算法——二分查找

二分查找 单纯的二分查找系列 基本思路 就是单纯的二分查找,但要注意可能存在的变形情况 74. 搜索二维矩阵 https://leetcode-cn.com/problems/search-a-2d-matrix/ class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int m = matrix.size();

dengh571的博客 589

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【l力扣hot100】二分查找专题|35、74、34、33、153、4

二分查找看似简单,却是面试中最容易"翻车"的题型之一。边界写 l < r 还是 l <= r?r = mid 还是 r = mid - 1?稍有不慎就会死循环或漏答案。本专题覆盖力扣 Hot 100 中所有二分相关题目,从最基础的搜索插入位置,到旋转数组找最小值、搜索目标值,再到两个正序数组的中位数,由浅入深,逐题拆解。每道题重点讲清三个问题:搜索空间怎么定、判断条件怎么写、边界怎么收缩。不背模板,理解本质,真正做到举一反三。

2401_87144364的博客 222

把一串数字拆分成数组_8. 旋转数组的最小数字

旋转数组的最小数字题目  把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组 {3, 4, 5, 1, 2} 为 {1, 2, 3, 4, 5} 的一个旋转,该数组的最小值为 1 。算法设计思想1. 暴力查找(Bruteforce Search):把旋转数组从前到后遍历一遍,其时间复杂度为 O(n)。很明显,这种思想...

weixin_42363315的博客 386

【思路详解+详细注释】小白都能看懂的力扣算法详解——二分算法

小白都能看懂的力扣算法详解——二分算法

Liu_y_xin的博客 1752

LeetCode题解:搜索旋转排序数组

搜索旋转排序数组(middle) 更好的阅读体验应该是: 审题-思考 答题 整理-归纳 一、题目 LeetCode:33.搜索旋转排序数组 给你一个整数数组 nums ,和一个整数 target 。 该整数数组原本是按升序排列,但输入时在预先未知的某个点上进行了旋转。(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 示例 1: 输入:nums = [4,5,6,

余光的博客 4000

二分查找进阶:旋转排序数组中的搜索II

本文介绍了在包含重复元素的旋转排序数组中搜索目标值的二分查找进阶方法。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 8383

[数组二分查找] 0033. 搜索旋转排序数组

然后创建两个指针 left、right,分别指向数组首尾。让后计算出两个指针中间值 mid。将 mid 与两个指针做比较,并考虑与 target 的关系。最直接的办法就是遍历一遍,找到目标值 target。但是还可以有更好的方法。考虑用二分查找来降低算法的时间复杂度。其实我们可以把第一种情况中的整个数组看做是左半部分,然后右半部分为空数组。经过「旋转」之后,会有两种情况,第一种就是原先的升序序列,另一种是两段升序的序列。我们将旋转后的数组看成左右两个升序部分:左半部分和右半部分。

人生需要动态规划 学习需要贪心算法 1901

二分查找题目:搜索旋转排序数组

由于数组中的每个值各不相同,因此如果数组经过旋转,则旋转之后的数组的首元素一定大于末尾元素。对于数组中的任意数,可以根据该数与数组的首元素和末尾元素的大小关系得到其在哪个有序子数组中。将升序数组旋转之后得到的数组整体不是有序的,但是可以分成两个有序子数组,因此同样可以使用二分查找的方法查找目标值。处的数,判断该数是否等于目标值以及位于哪一个有序子数组中,调整查找的下标范围。否则,如果目标值存在,一定位于下标范围。,则如果目标值存在,一定位于下标范围。,则如果目标值存在,一定位于下标范围。

stormsunshine的博客 1548

搜索旋转排序数组

假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。 示例 1: 输入: nums = [4,5,6,7,0,1,2], targ...

Wang.T的博客 5406
上一篇: 二分查找----3.在排序数组中查找元素的第一个和最后一个位置
下一篇: 二分查找----5.寻找旋转排序数组中的最小值
码破苍穹ovo
博客等级 码龄2年 377粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值