旋转数组求最小值

本文介绍了旋转数组的概念及如何获取旋转后的数组,详细解析了不含重复值和含重复值情况下,通过二分查找寻找旋转数组中最小值的方法。在不含重复值时,利用有序性和二分查找特性;在含重复值时,需调整二分查找策略以处理相等元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

旋转数组的概念就是对有序数组循环向右移动K位得到的数组。
例如[1,2,3,4,5]经过右移2位后旋转后得到:[4,5,1,2,3]

一、如何得到旋转数组

比如说现在要求旋转右移K位,求移动后的结果。

第一步要对K进行处理,因为假设原数组是[1,2,3]:
当K=1,旋转数组为[3,1,2]
当K=2,旋转数组为[2,3,1]
当K=3,旋转数组为[1,2,3]
当K=4,旋转数组为[3,1,2]

也就是说,当得到K时,先用K对n取模,n是数组大小。
然后就是旋转操作,这里其实不需要借助辅助空间,伪代码如下:
(1)逆置数组的前n-K个元素。
(2)逆置数组的后K个元素。
(3)逆置整个数组。
举个例子数组[1,2,3,4,5] K=2 结果是[4,5,1,2,3]。

按照上面的步骤得到中间结果分别是:
(1)[3,2,1,4,5]
(2)[3,2,1,5,4]
(3)[4,5,1,2,3]
得到所求。


二、不含重复值的情况

由于原数组是有序的,经过右移得到2个升序的子序列,两个子序列的分界点刚好就是原序列中的最大和最小值,因此可以利用二分查找的某些性质。

class Solution {
public:
    int findMin(vector<int>& num
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值