1 题目
题目:恢复旋转排序数组(Recover Rotated Sorted Array)
描述:给定一个旋转排序数组,在原地恢复其排序(升序)。什么是旋转数组?比如,原始数组为[1,2,3,4], 则其旋转数组可以是[1,2,3,4], [2,3,4,1], [3,4,1,2], [4,1,2,3]
lintcode题号——39,难度——easy
样例1:
输入:数组 = [4,5,1,2,3]
输出:[1,2,3,4,5]
解释:恢复旋转排序数组。
样例2:
输入:数组 = [6,8,9,1,2]
输出:[1,2,6,8,9]
解释:恢复旋转排序数组。
2 解决方案
2.1 思路
对于恢复旋转排序数组,可以使用三步翻转法,找到中间位置,翻转左右区间,再翻转整个序列即可,该题的翻转位置即数组中元素值最小的值所在的位置,考虑使用二分搜索,但是又因为数组中元素值可能重复,所以找最小值无法使用二分搜索,只能用遍历的方式来找。
每次翻转如果不使用库函数,可以使用双指针算法自己写。
2.2 时间复杂度
找最小值和翻转都需要遍历序列,时间复杂度为O(n)。
2.3 空间复杂度
空间复杂度为O(1)。
3 源码
细节:
- 三步翻转法,翻转不用reverse函数的话,需要对向双指针来实现
- 找最小值的index,如果数据可以重复的话,则无法用二分法寻找,只能遍历打擂台。
C++版本:
/**
* @param nums: An integer array
* @return: nothing
*/
void recoverRotatedSortedArray(vector<int> &nums) {
// write your code here
if (nums.empty())
{
return;
}
int index = findIndexOfMin(nums); // 找到最小值的下标
reverse(nums.begin(), nums.begin() + index); // 直接使用翻转函数
reverse(nums.begin() + index, nums.end());
reverse(nums.begin(), nums.end());
}
int findIndexOfMin(vector<int> & nums)
{
int minIndex = 0;
int minValue = INT_MAX;
for (int i = 0; i < nums.size(); i++)
{
if (nums.at(i) < minValue)
{
minValue = nums.at(i);
minIndex = i;
}
}
return minIndex;
}