当前位置:网站首页>leetcode 33. 搜索旋转排序数组 (二分经典题)
leetcode 33. 搜索旋转排序数组 (二分经典题)
2022-08-09 08:18:00 【_刘小雨】
作者简介:C/C++ 、Golang 领域耕耘者,创作者
个人主页:作者主页
活动地址:CSDN21天学习挑战赛
题目来源: leetcode官网
如果感觉博主的文章还不错的话,还请关注 、点赞 、收藏🧡三连支持一下博主哦~~~
题目描述
整数数组 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,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。
给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。
你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。
示例1:
输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4
示例2:
输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1
示例 3:
输入:nums = [1], target = 0
输出:-1
🧡 算法分析
此题方法是用二分
二分的本质是分段性,并非单调性。
即任何分段后满足某种性质的序列,都可以利用二分法完成查找,由于单调性是高频出现完成分段的一种情况,很多人则以为单调性是二分法的本质

算法步骤:
- 找出序列中分界点
- 确定目标值target 在前面一段还是后面一段
- 在确定得序列中,利用二分查找锁定位置
代码实现
class Solution {
public:
int search(vector<int>& nums, int target) {
// 二分找分界点, 这里利用性质>=nums[0], 所以当找到边界时, 它将是最后一个比nums[0]大的数
int l = 0, r = nums.size() - 1;
while(l < r)
{
int mid = l + r + 1 >> 1;
if(nums[mid] >= nums[0]) l = mid;
else r = mid - 1;
}
// 确定target在哪一段中
if (target >= nums[0]) l = 0;
else l = r + 1, r = nums.size() - 1;
// 二分找目标值
while(l < r)
{
int mid = l + r >> 1;
if(nums[mid] >= target ) r = mid;
else l = mid + 1;
}
if(nums[r] == target) return r;
else return -1;
}
};
执行结果:

时间复杂度分析
利用二分, 时间复杂度为O(logn)
如果觉得对你有帮助的话:
点赞,你的认可是我创作的动力!
🧡 收藏,你的青睐是我努力的方向!
️ 评论,你的意见是我进步的财富!
边栏推荐
- C语言笔记 学习预处理 学习宏定义
- Introduction to the Endpoint
- 进程同步与互斥问题纠错
- 数据库MySQL的安装和卸载
- 消息中间件(MQ)前置知识介绍(必看)
- jdbctemplate连接sql server,代码中查出来的数据跟数据库中不一致,如何解决?
- Matlab, and nonlinear equations solving linear equations
- OSI网络模型
- VMware virtual machine cannot be connected to the Internet after forced shutdown
- 3D软件开发工具HOOPS全套产品开发介绍 | HOOPS Exchange、HOOPS Communicator
猜你喜欢
随机推荐
Dark Horse 2022 latest redis course notes and knowledge points (for interview)
【Harmony OS】【ARK UI】公共事件模块
Object detection app based on appinventor and EasyDL object detection API
如何生成dll文件 采用VS2017生成dll文件(动态库文件)和lib文件(静态库文件)以C语言为例
bs4之爬取诗词学习
继承中的运算符重载:输入输出的传奇
Redis(八)集群
Jmeter连接Mysql和Mysql编码问题
文献检索作业代码
Database MySQL installation and uninstallation
The working principle of switch
磁盘管理与挂载
Redis redis 】 【 the expiration of listening
Introduction to the Endpoint
【愚公系列】2022年08月 Go教学课程 033-结构体方法重写、方法值、方法表达式
204. Count Primes
Shell编程之正则表达式
网络布线及数制转换
交换机的工作原理
Solidworks 2022 Inspection新增功能:光学字符识别、可自定义的检查报告








