【LeetCode】解题81:Search in Rotated Sorted Array II

FPGA图像处理入门 ZYNQ7020 图像中值膨胀腐蚀滤波 图像处理的三种滤波 中值滤波应用较为广泛 综合膨胀和腐蚀可以实现边缘检测。 阅读详情

LeetCode解题 81:Search in Rotated Sorted Array II

Problem 81: Search in Rotated Sorted Array II [Medium]

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., [0,0,1,2,2,5,6] might become [2,5,6,0,0,1,2]).

You are given a target value to search. If found in the array return true, otherwise return false.

Example 1:

Input: nums = [2,5,6,0,0,1,2], target = 0
Output: true

Example 2:

Input: nums = [2,5,6,0,0,1,2], target = 3
Output: false

Follow up:

  • This is a follow up problem to Search in Rotated Sorted Array, where nums may contain duplicates.
  • Would this affect the run-time complexity? How and why?

来源:LeetCode

解题思路

与题解33:Search in Rotated Sorted Array类似。需要多考虑一种两个边界相等的情况,采用的办法是进行两次二分查找。

  • 基本思路是利用二分查找,除了边界相等的情况,其余每层递归都能排除掉一半的数值。
  • 难点在于条件判断,需要考虑要查找的target会不会因为排序数组的旋转而不在原本二分查找的那半段范围。为了方便说明,将头尾相接处称为断崖,二分点下标称为p,以下为需要分类讨论的情况:
    a. 假设nums[p] < target,说明目标值较大,正常情况下需要查找数组的右半部分,此时应有nums[right] > target,需要查找p+1 ~ right-1;
    b. 当nums[right] < target时,与正常情况不同,是需要讨论的重点。按断崖所在的位置进行分类讨论。
    b1. 寻找断崖所处位置的方法是比较nums[right]与nums[p]的值,如果nums[right] < nums[p],则说明断崖在p ~ right之间,即最大的尾部处于这之间,要找的目标值比nums[p]大,就可以在p+1 ~ right-1之间查找。(例如在[4,5,6,7,8,9,1,2,3]中寻找9的第一次二分查找。)
    b2. 如果nums[right] > nums[p],则说明p ~ right之间是严格升序的,断崖应该在left ~ p之间,因此既比nums[p]大又比nums[right]大的目标值就应该在left ~ p-1之间查找。(例如在[7,8,9,1,2,3,4,5,6]中寻找9的第一次二分查找。)
    b3. 如果nums[right] = nums[p],那么无法判断出断崖在left ~ p([7,8,9,1,2,2,2,2,2]中找9)还是在p ~ right([2,2,2,2,2,3,9,1,2]中找9),因为都有可能。这种情况下,需要对两半部分都进行二分查找,只有两边都返回false,才能证明数组中不存在target。
    c. 上述数值比较过程中如果有正好相等的情况则之间返回下标即可。如果有left > right的情况则说明查找失败,返回false。
  • 数组个数为0或仅剩1个数且不为target时直接返回false。

极端情况下复杂度有可能为 O ( n ) O(n) O(n)。

要点:二分查找、条件判断

Solution (Java)

class Solution {
    public boolean search(int[] nums, int target) {
        int N = nums.length;
        if(N == 0) return false;
        return partSearch(nums, 0, N-1, target);
    }
    private boolean partSearch(int[] nums, int left, int right, int target){
        if(left > right) return false;
        if(left == right && nums[left] != target) return false;
        int p = (left + right) / 2;
        int nextl, nextr;
        if(nums[p] == target){
            return true;
        }
        else if(nums[p] < target){
            if(nums[right] == target){
                return true;
            }
            else if(nums[right] > target){
                return partSearch(nums, p+1, right-1, target);
            }
            else{
                if(nums[right] < nums[p]){
                	// 断崖在p~right之间
                    return partSearch(nums, p+1, right-1, target);
                }
                else if(nums[right] > nums[p]){
                	// 断崖在另半部分
                    return partSearch(nums, left, p-1, target);
                }
                else{ 
                    // 不能确定断崖位置,两半部分都要试
                    return partSearch(nums, left, p-1, target) || partSearch(nums, p+1, right-1, target);
                }
            }
        }
        else{
            if(nums[left] == target){
                return true;
            }
            else if(nums[left] < target){
                return partSearch(nums, left+1, p-1, target);
            }
            else{
                if(nums[left] > nums[p]){
                	// 断崖在left~p之间
                    return partSearch(nums, left+1, p-1, target);
                }
                else if(nums[left] < nums[p]){
                	// 断崖在另半部分
                    return partSearch(nums, p+1, right, target);
                }
                else{
                	// 不能确定断崖位置,两半部分都要试
                    return partSearch(nums, left+1, p-1, target) || partSearch(nums, p+1, right, target);
                }
            }
        }
    }
}
社交媒体文章内容与评论抓取:Python 爬虫实战教程 通过本文的介绍,我们学习了如何使用 Python 编写爬虫,抓取社交媒体平台的文章内容和评论。我们详细介绍了如何使用requestsSelenium和Tweepy等工具,抓取微博和 Twitter 上的公开数据。同时,我们还讨论了如何处理反爬虫机制,避免账号或 IP 被封禁。抓取社交媒体数据是一个充满挑战和乐趣的过程,掌握这些技术后,你可以在大数据分析、情感分析和舆情监测等方面得到更深层次的应用。 阅读详情

相关推荐

U8备份提示“远程组件初始化失败”

问题现象: SQL出现问题后重装,U8没有重装,之后直接附加数据库,U8可以正常登陆,但是在备份的时候提示远程组件初始化失败。 问题原因: 因为重装了SQL,没有进行U8数据源初始化,导致Master库中丢失了存储过程储 解决办法:在Master库重建存储过程 USE [master] GO SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER OFF GO CREATE PROCEDURE [dbo].[U8FileServerExtendProc] @cmdLi.

SamYux 2471

leetcode专题训练 81. Search in Rotated Sorted Array II

这道题是33. Search in Rotated Sorted Array的升级版,与之前不同的地方是这道题允许存在重复的数字。在之前的33题题解中,我采用的是先找pivot的方法,也就是先找到数组中最大的元素,这样的话,最大的元素两侧都是有序数组,再分别在这两边进行二分查找即可。 然而在这道题中,参考了题解的方法,不用先找pivot。二分归到底就是要知道接下来要去左半边找还是去右半边找,题解中判断的方式就很巧妙。 首先得到mid,也就是数组的中间位置。 如果中间位置的左边有序,那么就可以通过判断num

Ema1997的博客 331

树莓派5安装ROS2小白指南避坑攻略

手把手教你如何在树莓派5上顺利安装ROS2,避开常见问题与陷阱,提升配置效率。针对树莓派5安装ros2过程中的依赖冲突、源配置错误等高频难题提供解决方案,适合新手快速上手。

weixin_35754962的博客 1003

leetcode刷题(python)--33. Search in Rotated Sorted Array(思路以及两种解法-迭代和递归)

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.(i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).You are given a target value to search. If found in t...

u014180553的博客 1261

Allegro Design Entry CIS 与 OrCAD Capture CIS:PCB设计工具链中的双雄对决

本文深入对比了Cadence旗下两大原理图设计工具Allegro Design Entry CIS与OrCAD Capture CIS。Allegro Design Entry CIS源自Concept HDL,定位高端,强调自顶向下的层次化设计和与Allegro PCB Editor的无缝约束管理,适合大型复杂系统及团队协作。OrCAD Capture CIS则以其出色的易用性、广泛的兼容性和强大的CIS数据库功能著称,是中小型项目及跨工具链协作的通用选择。文章从历史渊源、核心功能、适用场景等多维度剖析,

bush的博客 486

UNITE真菌数据库使用避坑指南:从下载到注释的完整流程

本文提供了UNITE真菌数据库从下载到注释的完整实战指南。针对真菌ITS序列分析,重点解析了数据库版本选择、格式转换的常见陷阱,并详细介绍了如何训练优化的sklearn分类器以提升物种注释的精度和可靠性,帮助用户构建高效稳定的本地工作流。

weixin_29240343的博客 198

Find Minimum in Rotated Sorted Array II -- LeetCode

这道题是Search in Rotated Sorted Array的扩展,思路在Find Minimum in Rotated Sorted Array中已经介绍过了,和Find Minimum in Rotated Sorted Array唯一的区别是这道题目中元素会有重复的情况出现。不过正是因为这个条件的出现,影响到了算法的时间复杂度。原来我们是依靠中间和边缘元素的大小关系,来判断哪一半是不

Code Ganker 1万+

PLC集群管理:C#上位机实现10台以上分布式PLC的集中监控与指令下发

本文介绍了一套基于C# WPF开发的PLC集群管理系统,用于解决现代工业自动化产线中分布式PLC监控难题。系统采用三层解耦架构,支持100台以内不同品牌PLC的集中管理,具备批量数据采集、指令下发、实时报警等功能。核心创新点包括:1)基于异步IO的连接池管理;2)统一通信接口设计;3)寄存器合并优化算法;4)三级优先级指令队列。实际应用表明,系统数据采集延迟低于100ms,指令下发成功率99.9%,有效解决了传统单PLC监控模式存在的效率低下问题。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 506

Search in Rotated Sorted Array II -- LeetCode

原题链接:http://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/这道题是二分查找Search Insert Position的变体,思路在Search in Rotated Sorted Array中介绍过了,不了解的朋友可以先看看那道题哈。和Search in Rotated Sorted Array唯一的...

编程语言小筑 268

PCL 平面点云的凹多边形边界提取【2025最新版】

平面点云的凹多边形边界提取及边界轮廓线绘制。博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 7183

Python 爬虫实战:爬虫与 ECharts 结合 —— 前端可视化展示

本文介绍了爬虫技术与ECharts可视化结合的完整实现流程。首先使用Python爬取京东商品数据(价格、评价数等),通过BeautifulSoup解析和pandas处理转换为JSON格式。然后构建前端页面,利用ECharts实现价格分布柱状图、价格-评价数散点图和店铺占比饼图三种可视化效果。文章详细解析了爬虫数据提取、格式转换和前端图表配置等关键技术点,并提供了完整的代码示例。最后提出了基于API接口、数据库存储等扩展方向,为数据采集到可视化展示提供了完整的解决方案。

2503_91057718的博客 630

Search in Rotated Sorted Array -- LeetCode

原题链接:http://oj.leetcode.com/problems/search-in-rotated-sorted-array/这道题是二分查找Search Insert Position的变体,看似有点麻烦,其实理清一下还是比较简单的。因为rotate的缘故,当我们切取一半的时候可能会出现误区,所以我们要做进一步的判断。具体来说,假设数组是A,每次左边缘为l,右边缘为r,还有中间位置...

编程语言小筑 298

Backtrader Web:开源量化交易全栈平台

Backtrader Web是一个基于Backtrader框架的现代化量化交易全栈平台,将专业回测引擎与Web技术结合,提供从策略开发到实盘交易的完整解决方案。平台采用FastAPI+Vue3技术栈,具有118个内置策略模板、专业可视化分析工具和完整的策略生命周期管理功能。支持策略版本控制、参数优化、模拟/实盘交易及监控告警,通过RESTful API和WebSocket实现前后端交互。系统采用模块化设计,包含策略服务、回测服务等核心模块,支持SQLite/PostgreSQL等多种数据库。安装简单,5分钟

云金杞 641

LeetCode 查找类题目

4. Median of Two Sorted Arrays题意:查找两个有序数组的中位数。思路:通过查找第k个数的方法来找中位数,对于A、B两个数组,如果A[k/2]&gt;B[k/2]那么两个数组并集的中位数肯定不在B的前k/2个元素中,所以可以删掉一部分数,反之亦可,最后剩下的就是所求的中位数。具体见代码。参考:http://blog.youkuaiyun.com/gao1440156051/artic...

qq_38345430的博客 899

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

LeetCode 81. Search in Rotated Sorted Array II(二分)

Search in Rotated Sorted Array II Medium Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., [0,0,1,2,2,5,6] might become [2,5,6,0,0,1,2]). You are gi...

da_kao_la的博客 203

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[leetcode 81] Search in Rotated Sorted Array II

题目描述: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). Write a function to determine if a given targe

新博客地址:www.yizhen-blog.com 欢迎交流 768

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[leetcode] 81. Search in Rotated Sorted Array II 解题报告

题目链接:https://leetcode.com/problems/search-in-rotated-sorted-array-ii/ Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this affect the run-time complexity

小榕流光的专栏 743

【LeetCode】 81. Search in Rotated Sorted Array II 搜索旋转排序数组 II(Medium)(JAVA)

【LeetCode】 81. Search in Rotated Sorted Array II 搜索旋转排序数组 II(Medium)(JAVA) 题目地址: https://leetcode.com/problems/search-in-rotated-sorted-array-ii/ 题目描述: Suppose an array sorted in ascending order is ro...

qq_16927853的博客 252

LeetCode-81. Search in Rotated Sorted Array II [C++][Java]

There is an integer arraynumssorted in non-decreasing order (not necessarily withdistinctvalues). Given the arraynumsafterthe rotation and an integertarget, returntrueiftargetis innums, orfalseif it is not innums.

贫道绝缘子的博客 239

Leetcode-81. Search in Rotated Sorted Array II

公众号每天发布一篇关于Leetcode解题技巧的文章,尝试从多角度、不同方法对题目进行解析。欢迎大家关注! 题目描述(中等难度) 这题是33题的升级版,数组的操作没有变,所谓的旋转数组,就是把有序数组前边若干个数字移动到末尾。区别在于这道题出现了重复的数字,同样是找 target。 解法一 把数组遍历一遍,然后依次判断数字是否相等的解法,当然就不用说了。这里直接在33 题解法的基础上去修改。3...

猫敷雪 526

【LeetCode】81. Search in Rotated Sorted Array II 解题报告(Python)

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

L141210113的专栏 345

[leetcode] 33. Search in Rotated Sorted Array 解题报告

题目链接:https://leetcode.com/problems/search-in-rotated-sorted-array/ Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2)

小榕流光的专栏 2034

LeetCode Search in Rotated Sorted Array

把一个严格升序的数组进行旋转,如[0,1,2,3,4,5]旋转3位成为[3,4,5,0,1,2]。在这样的数组中找到目标数字。如果存在返回下标,不存在返回-1。

DRFish 2920

81. Search in Rotated Sorted Array II【leetcode解题报告】

Description Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., [0,0,1,2,2,5,6] might become [2,5,6,0,0,1,2]). You are given a target value to sear...

tan_change的专栏 262

【一天一道LeetCode】#81. Search in Rotated Sorted Array II

一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Follow up for “Search in Rotated Sorted Array”: What if duplicates are allowed? Would this

ZeeCoder 2731

LeetCode--81. Search in Rotated Sorted Array II

题目链接:https://leetcode.com/problems/search-in-rotated-sorted-array-ii/ 要求在一个被旋转的排序数组中寻找目标值,判断是否存在。应为涉及到二分法,所以可以先看看这一篇关于二分法的bug free模板博客(https://blog.youkuaiyun.com/To_be_to_thought/article/details/85373817)...

To_be_thinking的博客 168
上一篇: 【LeetCode】解题80:Remove Duplicates from Sorted Array II
下一篇: 【LeetCode】解题84:Largest Rectangle in Histogram
Fayedy
博客等级 码龄11年 2粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值