Leetcode(81)——搜索旋转排序数组 II

Java实现 LeetCode 81 搜索旋转排序数组 II(二) 81. 搜索旋转排序数组 II 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。 示例 1: 输入: nums = [2,5,6,0,0,1,2], target = 0 输出: true 示例 2: 输... 阅读详情

Leetcode(81)——搜索旋转排序数组 II

题目

已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。

在传递给函数之前,nums 在预先未知的某个下标 k(0<=k<nums.length0 <= k < nums.length0<=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] 。

给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums 中存在这个目标值 target ,则返回 true ,否则返回 false 。

你必须尽可能减少整个操作步骤。

示例 1:

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

示例 2:

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

提示:

111 <= nums.length <= 500050005000
−104-10^4−104 <= nums[i] <= 10410^4104
题目数据保证 numsnumsnums 在预先未知的某个下标上进行了旋转
−104-10^4−104 <= target <= 10410^4104

进阶:

  • 这是 搜索旋转排序数组 的延伸题目,本题中的 numsnumsnums 可能包含重复元素。
  • 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?

题解

方法一:二分查找

思路

​​  但和 33. 搜索旋转排序数组 不同的是,本题元素并不唯一。这意味着我们无法直接根据与 nums[0]nums[0] 的大小关系,将数组划分为两段,即无法通过「二分」来找到旋转点。因为「二分」的本质是二段性,并非单调性。只要一段满足某个性质,另外一段不满足某个性质,就可以用「二分」。
在这里插入图片描述
​​  即使数组被旋转过,我们仍然可以利用这个数组的递增性,使用二分查找。对于当前的中点,如果它指向的值小于等于右端,那么说明右区间是排好序的;反之,那么说明左区间是排好序的。如果目标值位于排好序的区间内,我们可以对这个区间继续二分查找;反之,我们对于另一半区间继续二分查找。
​​  注意,因为数组存在重复数字,如果中点和左端的数字相同,我们并不能确定是左区间全部相同,还是右区间完全相同。在这种情况下,我们可以简单地将左端点右移一位,然后继续进行二分查找。

​​  例如 nums=[3,1,2,3,3,3,3]\textit{nums}=[3,1,2,3,3,3,3]nums=[3,1,2,3,3,3,3],target=2\textit{target}=2target=2,首次二分时无法判断区间 [0,3][0,3][0,3] 和区间 [4,6][4,6][4,6] 哪个是有序的。

代码实现

Leetcode 官方题解:

class Solution {
public:
    bool search(vector<int> &nums, int target) {
        int n = nums.size();
        if (n == 0) return false;
        else if (n == 1) return nums[0] == target;
        int l = 0, r = n - 1, mid;
        while (l <= r) {
            mid = (l + r) / 2;
            if (nums[mid] == target) return true;
            if (nums[l] == nums[mid] && nums[mid] == nums[r]) {
            	// 去掉首尾重复的元素,保证二段性
                ++l;
                --r;
            } else if (nums[l] <= nums[mid]) {	// 左区间是排好序的了
                if (nums[l] <= target && target < nums[mid]) 	// 判断 target 是否在左区间里
                    r = mid - 1;
                else l = mid + 1;
            } else {	// 右区间是排好序的了
                if (nums[mid] < target && target <= nums[n - 1])	// 判断 target 是否在右区间里
                    l = mid + 1;
                else r = mid - 1;
            }
        }
        return false;
    }
};
复杂度分析

时间复杂度:O(log⁡n)O(\log{n})O(logn)。最坏情况下数组元素均相等且不为 target\textit{target}target,我们需要访问所有位置才能得出结果。此时的时间复杂度为 O(n)O(n)O(n),其中 nnn 是数组 nums\textit{nums}nums 的长度。
空间复杂度:O(1)O(1)O(1)

【中等】力扣算法题解析LeetCode81:搜索旋转排序数组 II 题目要求在旋转后的非降序数组中查找目标值,数组可能包含重复元素。核心思路是二分查找,但需处理重复元素干扰。通过判断有序区间(左半或右半)并调整搜索范围,时间复杂度最优为 O(log n),最坏情况(全重复)为 O(n)。代码实现中处理了重复元素,确保正确缩小搜索范围。示例输入验证了算法的正确性,如 nums = [2,5,6,0,0,1,2] 查找 target = 0 返回 true,查找 3 则返回 false。 阅读详情

相关推荐

maxwell与steady state thermal 通过workbench耦合仿真

文章目录maxwellsteady state thermal maxwell 1加入maxwell并打开 2导入模型 3选择求解器类型:涡流求解器eddy current 4修改模型名字不能带_等特殊符号 5为模型赋材料 6设立3D边界,各边电流进出方向为0其余方向300 7设置激励条件,可设置电流大小,相位,方向 8设置集肤深度,选取中间铜导体的体然后设置,如何设置看帮助文档 9求解设置 迭代步数 收敛精度 交流电频率 10验证条件满足计算 11求解 发现无法求解,删除ai

roymustang的博客 9197

【LeetCode每日一题】81. 搜索旋转排序数组 II

【LeetCode每日一题】81. 搜索旋转排序数组 II题目:已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。在传递给函数之前,nums 在预先未知的某个下标 k...

Francis的博客 398

学习Fidder主要掌握的技术——流量篡改

本文介绍了Fiddler工具的三种常用调试方法:1)本地映射-通过保存修改JSON响应文件实现接口数据模拟;2)Composer接口调试-通过修改请求参数快速测试接口异常处理;3)断点调试-在请求/响应过程中拦截并修改数据。这三种方法分别适用于前端开发、接口测试和健壮性验证等场景,能够有效提高调试效率。操作步骤包括保存响应、修改数据、配置规则等关键环节,并提供了详细的界面操作指引。

2301_79022773的博客 352

leetcode:81. 搜索旋转排序数组 II

本题元素不唯一,这意味着我们无法直接根据nums[0]的大小关系,将数组分为为两段,即无法通过「二分」来找到旋转点。因为「二分」的本质是二段性,并非单调性。只要一段满足某个性质,另外一段不满足某个性质,就可以用「二分」。我们知道,所谓的旋转其实就是「将某个下标前面的所有数整体移到后面,使得数组从整体有序变为分段有序」。的扩展,区别在于本题有重复元素。......

OceanStar的博客 296

基于ESP32的气象雷达站设计与实现

物联网技术通过嵌入式设备实现环境数据的实时采集与可视化,其中ESP32凭借其双核处理器和WiFi/蓝牙功能成为热门选择。本项目利用ESP32结合LVGL图形库,构建了一个低成本气象监测系统,通过OpenWeatherMap API获取全球气象数据并在7英寸触摸屏上动态展示。系统采用三级优化策略处理高分辨率雷达图,包括服务端预处理、硬件加速解码和显示增强,有效解决了内存占用和帧率问题。在物联网设备开发中,类似方案可应用于智能家居、农业监测等场景,特别是需要实时数据可视化的领域。通过SPIFFS存储和zlib压

weixin_42524864的博客 422

Python爬虫实战:公共资源交易平台招标数据采集实战 - 从零构建企业情报系统(附CSV导出 + SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 1286

LeetCode 题目 81:搜索旋转排序数组 II

多种算法详解 LeetCode 题目 81:搜索旋转排序数组 II

10年数据\经营分析经验,现任大厂数据分析负责人 832

【数字孪生与仿真技术】05:从原理到实战:MATLAB/Simulink在航空航天GNC系统开发中的深度解析(含全流程代码与认证指南)

摘要:本文系统阐述MATLAB/Simulink在航空航天制导、导航与控制(GNC)系统开发中的核心应用。通过解析GNC系统高保真动力学建模、多源导航传感器融合、鲁棒控制算法设计等关键技术原理,结合Virgin Orbit运载火箭、CubeSat等真实案例,展示从需求分析、模型搭建、仿真验证到代码生成与认证的完整开发流程。文中提供1200余行关键代码、8个可复用Simulink模型及详细执行结果展示,涵盖DO-178C认证支持、实时性能优化等工业级开发规范,为航空航天工程师、科研人员提供可落地的参考方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1655

LeetCode 搜索旋转排序数组II

假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。 示例 1: 输入: nums = [2,5,6,0,0,1,2], target = 0 输出: true 示例 2: 输入: nums = [2,5,...

hestyle的博客 610

数据治理——详解元数据、资源目录、主数据、数据元、元数据管理、主数据管理【附全文阅读】

摘要:数据中心建设的核心是元数据管理,即"描述数据的数据",包含内容、质量、所有者等关键信息。元数据在数据仓库中记录数据源、转换规则等,是管理基础;主数据管理则确保核心业务数据的准确一致。二者共同构建高效的数据资源目录,为数据服务提供支撑。(99字)

cdfunlove的博客 98

【ComfyUI】Flux 图像扩展

本文介绍了一个基于Flux扩图技术的ComfyUI工作流,能够智能扩展图像尺寸并保持内容连贯性。该流程通过扩散模型与条件编码的结合,对图像边缘进行语义填充生成,适用于艺术创作、海报设计等场景。工作流包含图像加载、外扩填充、文本编码、扩散采样等核心节点,采用Flux1-fill-dev等专业模型确保生成质量。演示效果显示,系统能自然延伸原图内容,保持风格统一。该技术可广泛应用于插画扩展、摄影增强、游戏场景构建等领域,显著提升创意工作效率。

Mr数据杨 927

81. 搜索旋转排序数组 II

nums[n-1], nums[0], nums[1], …例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4]。给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。输入:nums = [2,5,6,0,0,1,2], target = 0。输入:nums = [2,5,6,0,0,1,2], target = 3。你必须尽可能减少整个操作步骤。

Winn~ 206

NVIDIA Isaac Sim 入门教程(二)

Omniverse Isaac Sim 的工作空间非常容易自定义。调整用户界面的大小、停靠、取消停靠、添加和移除面板都非常容易。进入顶部菜单栏,单击下拉菜单最下方的窗口 > 视口 > 视口 2(现在工作区中应该会出现一个名为 "视口 2 "的新视口。如果您想创建更多的视口,请按照相机检查器扩展进行操作。单击并拖动视口 2 的顶部标题以激活停靠部件。拖放到原始视口的右侧,将两个视口并排放置。单击并向左拖动视口 2 的左侧,使视口大小相等。

机器人控制与仿真应用 6543

LeetCode第81题_搜索旋转排序数组II

已知存在一个按非降序排列的整数数组nums,数组中的值不必互不相同。在传递给函数之前,nums在预先未知的某个下标k)上进行了旋转,使数组变为(下标从 0 开始计数)。例如,在下标5处经旋转后可能变为。给你旋转后的数组nums和一个整数target,请你编写一个函数来判断给定的目标值是否存在于数组中。如果nums中存在这个目标值target,则返回true,否则返回false。你必须尽可能减少整个操作步骤。

qq_40263592的博客 1151

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

LeetCode 力扣 81. 搜索旋转排序数组 II

题目描述(中等难度) 33题的升级版,数组的操作没有变,所谓的旋转数组,就是把有序数组前边若干个数字移动到末尾。区别在于这道题出现了重复的数字,同样是找 target。 解法一 把数组遍历一遍,然后依次判断数字是否相等的解法,当然就不用说了。这里直接在33 题解法三的基础上去修改。33 题算法基于一个事实,数组从任意位置劈开后,至少有一半是有序的,什么意思呢? 比如 [ 4 5 6 7 1 2 ...

wind_liang的博客 884

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Leetcode 81. Search in Rotated Sorted Array II 搜索旋转排序数组 II

Leetcode 81. Search in Rotated Sorted Array II 搜索旋转排序数组 II 标签: Leetcode 题目地址: https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/ 题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,0,1...

CoderWangSon 245

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

''' 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 (例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。 其中,在原始的数组中可能包含重复的元素 ''' class Solution: def search(self, nums, targ...

WYXHAHAHA123的博客 143

Python描述 LeetCode 81. 搜索旋转排序数组 II

Python描述 LeetCode 81. 搜索旋转排序数组 II   大家好,我叫亓官劼(qí guān jié ),在GitHub & 优快云中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在GitHub & 优快云中写博客,唯一博客更新的地址为:亓官劼的博客 ,近期将逐渐同步刷题相关记录到GitHub:[Algorithmic-learning-records] (https://github.com/qiguanjie/Algorithmic-learning-r

一起加油 1249

golang力扣leetcode 81.搜索旋转排序数组II

81.搜索旋转排序数组II81.搜索旋转排序数组II题解代码 81.搜索旋转排序数组II 81.搜索旋转排序数组II 题解 在上一题的基础上去重即可 代码 package main func search(nums []int, target int) bool { left, right := 0, len(nums)-1 for left+1 < right { for left < right && nums[left] == nums[left+1] {

清风 402

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

Leetcode 81. 搜索旋转排序数组 II 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。 测试样例 1. 输入: nums = [2,5,6,0,0,1,2], target = 0 输出: true 2. 输入: nums = [2,5,6,0,0,1,2], target = 3 输出: fa

weixin_43750513的博客 302

81. 搜索旋转排序数组 II - 力扣(LeetCode)

题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。 示例 1: 输入: nums = [2,5,6,0,0,1,2], target = 0 输出: true 示例 2: 输入: nums = [...

Onwaier的博客 450

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

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 81. 搜索旋转排序数组 II,做好准备了么,那么开始吧。 🌲🌲🐴🐴 二分查找 与以往不同的是,此题数组中的值不必互不相同,而且数组部分有序,故我们需要多添加条件来解题。

weixin_62275996的博客 722

【LeetCode: 81. 搜索旋转排序数组 II + 二分查找】

【LeetCode: 81. 搜索旋转排序数组 II + 二分查找】已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums 中存在这个目标值 target ,则返回 true ,否则返回 false 。

Coder_ljw的博客 1368

利用python 完成leetcode81 搜索旋转排序数组 II

假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。 示例 1: 输入: nums = [2,5,6,0,0,1,2], target = 0 输出: true 示例 2: 输入: nums = [2,5,6...

找到工作之前一天十篇的博客 375

leetcode 81. 搜索旋转排序数组 II medium

leetcode81. 搜索旋转排序数组 II medium 题目描述: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组[0,0,1,2,2,5,6]可能变为[2,5,6,0,0,1,2])。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回true,否则返回false。 示例1: 输入: nums = [2,5,6,0,0,1,2], target = 0 输出: true 示例2: 输入: nums = [2,5,6...

speargod的博客 213

Leetcode—81. 搜索旋转排序数组 II【中等】

运行结果 之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

Atticus的博客 629
上一篇: Leetcode(34)——在排序数组中查找元素的第一个和最后一个位置
下一篇: Leetcode(154)——寻找旋转排序数组中的最小值 II
486L
博客等级 码龄7年 20粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值