4-二分-索引二分-搜索旋转排序数组 II

这是索引二分的第四篇算法,力扣链接

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

在传递给函数之前,nums 在预先未知的某个下标 k0 <= 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

老规矩,先上无脑暴力求解,这道题就是普通的旋转数组,呈断崖式递增,和之前的旋转数组类似,最本质的区别是当前的题会有重复的场景。

func search(nums []int, target int) bool {for _, num := range nums {if num == target {return true}}return false
}

二分法逻辑其实和旋转数组也差不多,借此机会复习一下。

这里要分情况讨论,先确定target位于的区间。

如果target在左区间(target >= nums[0]):

- 如果mid位于左区间(nums[mid] > nums[0]),正常二分法可以找到解。

- 如果mid位于右区间(nums[mid] < nums[0]),尽量使右指针左移到左边界。

如果target在右边界(target < nums(len(nums)-1)

- 如果mid位于左区间(nums[mid] > nums[0]),尽量使左指针靠近右区间左边界。

- 如果mid位于右区间(nums[mid] < nums[0]),正常二分法可以求解。

得到代码如下:

func search(nums []int, target int) bool {l, r := 0, len(nums)-1for l <= r {mid := l + (r-l)/2if nums[mid] == target {return true}if target >= nums[0] {if nums[mid] >= nums[0] {if nums[mid] < target {l = mid + 1} else {r = mid - 1}} else {r = mid - 1}} else {if nums[mid] <= nums[len(nums)-1] {if nums[mid] < target {l = mid + 1} else {r = mid - 1}} else {l = mid + 1}}}return false
}

执行发现,并没通过,在[1,0,1,1,1]找0的场景报错了,为什么呢?因为nums[l] == nums[mid] == nums[r] 并不能判断出来,当前位于哪个区间。

我们可以尝试 l++ r-- 缩小一下范围,这样就没有左右区间模糊的场景了。

但是还有一个问题,原来的整体坐标边界参考是nums[0]和nums[len(nums)-1],在缩小范围后,也会随之变化为nums[l] 和 nums[r]。

得到代码如下:

func search(nums []int, target int) bool {l, r := 0, len(nums)-1for l <= r {mid := l + (r-l)/2if nums[mid] == target {return true}if nums[l] == nums[r] && nums[l] == nums[mid] {l++r--continue}if target >= nums[l] {if nums[mid] >= nums[l] {if nums[mid] < target {l = mid + 1} else {r = mid - 1}} else {r = mid - 1}} else {if nums[mid] <= nums[r] {if nums[mid] < target {l = mid + 1} else {r = mid - 1}} else {l = mid + 1}}}return false
}

逻辑优化:

func search(nums []int, target int) bool {l, r := 0, len(nums)-1for l <= r {mid := l + (r-l)/2if nums[mid] == target {return true}if nums[l] == nums[r] && nums[l] == nums[mid] {l++r--continue}if target >= nums[l] {if nums[mid] >= nums[l] && nums[mid] < target {l = mid + 1} else {r = mid - 1}} else {if nums[mid] <= nums[r] && nums[mid] > target {r = mid - 1} else {l = mid + 1}}}return false
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RocketMQ-源码架构

源码环境搭建 1、主要功能模块 RocketMQ官方Git仓库地址&#xff1a;GitHub - apache/rocketmq: Apache RocketMQ is a cloud native messaging and streaming platform, making it simple to build event-driven applications. RocketMQ的官方网站下载&#xff1a;下载 | R…

现在多种数据库的读写模型对比

目录 mongDB read write ES read write MySql write 总结 mongDB 3.0 版本后的WiredTiger存储引擎 read 1. 应用通过driver 发起Buffer I/O读操作&#xff0c;由操作系统将磁盘数据页加载到文件系统的页缓存区 2. 引擎层读取页缓冲区的数据&#xff0c;进行解压后放…

C++STL算法库中谓词的使用

什么是c的谓词 谓词概念&#xff1a; 谓词函数是一个判断式&#xff0c;一个返回bool值的函数或者仿函数&#xff0c;有几个入参就是几元谓词。一般做一个函数的参数使用【引用自百度百科】。 常见的可以作为谓词的东西&#xff1a;函数、函数指针、函数对象、lambda表达式&am…

2023 年浙江省职业院校技能大赛信息安全管理与评估赛项规程

*2023 年浙江省职业院校技能大赛“高职组”* *“信息安全管理与评估”赛项规程* *一、赛项名称* 赛项名称&#xff1a;信息安全管理与评估 英文名称&#xff1a;Information Security Management and Evaluation 赛项组别&#xff1a;高职 赛项归属产业&#xff1a;电子信…

热电厂发电机组常见故障及预测性维护方法

热电厂的发电机组是关键的能源生产设备&#xff0c;在电力供应中扮演着关键角色。但经过长期运行和高负荷工作&#xff0c;一旦发生故障&#xff0c;可能导致停机、设备损坏甚至引发严重事故。因此&#xff0c;实施有效的预测性维护方法对于确保发电机组的稳定运行至关重要。本…

Linux(17):认识与分析登录档

什么是登录档 【详细而确实的分析以及备份系统的登录文件】是一个系统管理员应该要进行的任务之一。 登录档 就是记录系统活动信息的几个文件&#xff0c;例如&#xff1a;何时、何地(来源IP)、何人(什么服务名称)、做了什么动作(讯息登录啰)。 换句话说就是&#xff1a;记录系…

【MySQL】:表的操作

表的操作 一.创建表二.查看表结构三.修改表四.删除表 一.创建表 field 表示列名。 datatype 表示列的类型。 character set 字符集&#xff0c;如果没有指定字符集&#xff0c;则以所在数据库的字符集为准。 collate 校验规则&#xff0c;如果没有指定校验规则&#xff0c;则以…

MySQL系列(二)——日志篇

MySQL日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中&#xff0c;比较重要的还要属二进制日志binlog&#xff08;归档日志&#xff09;和事务日志redo log&#xff08;重做日志&#xff09;和undo log&#xff08;回滚日志&#xff09;。 今…

windows批处理脚本(.bat)如何激活Anconda Prompt虚拟环境

通过call 来调用激活脚本&#xff0c; activate myenv指的是要激活的环境&#xff0c;若省略&#xff0c;则激活的是base环境。 call : 从另一个批处理程序调用一个批处理程序&#xff0c;而不停止父批处理程序。 call C:\ProgramData\Anaconda3\Scripts\activate.bat activate…

fastdds共享内存实现原理

fastdds 共享内存分两个部分&#xff0c;一部分用于保存数据&#xff0c;一部分用于通信。 fastrtps_“UUID”:共享内存包括又两部分数据&#xff0c;BufferNode和segment_size, 用配置文件port_queue_capacity_指定BufferNode的数量&#xff0c;segment_size用于保存实际传输的…

imp导入数据发现的

迁移历史数据到历史库&#xff0c;因为灾备数据中心使用的DG&#xff0c;无法使用数据泵&#xff0c;只能通过exp导出&#xff0c;然后再通过imp导入 为防止undo表空间压力过大&#xff0c;在导入时imp使用了commit参数及buffer参数 这次导入数据量达到1TB&#xff0c;刚到了1/…

智物发布MT6877平台无线AR智能眼镜参考设计,推动下一代无线AR发展

随着增强现实(AR)技术的不断发展&#xff0c;有线AR眼镜在连接和使用方面存在一些限制。为了解决这些问题&#xff0c;无线AR智能眼镜的推出势在必行。 新一代无线AR智能眼镜采用了天玑900&#xff08;MT6877&#xff09;平台作为参考设计&#xff0c;搭载了2.4GHz的八核处理器…

【rabbitMQ】Exchanges交换机

上一篇&#xff1a;springboot整合rabbitMQ模拟简单收发消息 https://blog.csdn.net/m0_67930426/article/details/134904766 本篇代码基于上一篇继续写 目录 Fanout 交换机 1. add queue 2. add Exchange 3.绑定队列 Direct 交换机 1. add queue 2. add Exchange 3.…

011 数据结构_哈希

前言 本文将会向你介绍哈希概念&#xff0c;哈希方法&#xff0c;如何解决哈希冲突&#xff0c;以及闭散列与开散列的模拟实现 1. 哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经…

CyclicBarrier、CountDownLatch、Semaphore 的用法

CyclicBarrier、CountDownLatch、Semaphore 的用法 CountDownLatch&#xff08;线程计数器 &#xff09; CountDownLatch 类位于 java.util.concurrent 包下&#xff0c;利用它可以实现类似计数器的功能。比如有一个任务 A&#xff0c;它要等待其他 4 个任务执行完毕之后才能执…

数据结构与算法-Rust 版读书笔记-2线性数据结构-队列

数据结构与算法-Rust 版读书笔记-2线性数据结构-队列 1、队列&#xff1a;先进先出 队列是项的有序集合&#xff0c;其中&#xff0c;添加新项的一端称为队尾&#xff0c;移除项的另一端称为队首。一个元素在从队尾进入队列后&#xff0c;就会一直向队首移动&#xff0c;直到…

鸿蒙原生应用再添新丁!同花顺入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;同花顺入局鸿蒙 来自 HarmonyOS 微博12月11日消息&#xff0c;同花顺已完成#鸿蒙原生应用#beta版本&#xff0c;并正在进行全量版本开发&#xff0c;进一步丰富了#鸿蒙原生应用#的覆盖领域。同花顺作为股民和券商首选的一站式金融理财服务平台…

扩展学习|商业智能和分析:从大数据到大影响

文献来源&#xff1a;Chen H, Chiang R H L, Storey V C. Business intelligence and analytics: From big data to big impact[J]. MIS quarterly, 2012: 1165-1188. 下载链接&#xff1a;https://pan.baidu.com/s/1JoHcTbwdc1TPGnwXsL4kIA 提取码&#xff1a;a8uy 在不同的组…

MySQL忘记密码

根据提供的引用内容&#xff0c;当使用root用户登录MySQL时&#xff0c;如果密码错误&#xff0c;会出现"Access denied for user ‘root’‘localhost’ (using password: NO)"的错误提示。这个错误提示表示使用了错误的密码或者没有输入密码就尝试登录MySQL。解决这…

SQL命令---查看数据库表

介绍 使用sql命令查看数据表。 命令 show create table 表名\G;\G&#xff1a;使显示结果整齐美观。