旋转数组的概念就是对有序数组循环向右移动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