63 恢复旋转排序数组(Recover Rotated Sorted Array)

本文探讨了如何在给定旋转排序数组中,利用三步翻转法恢复其升序排列。通过遍历寻找最小值并进行区间翻转,达到原地修复的目的。时间复杂度为O(n),空间复杂度为O(1)。适合初学者理解旋转数组问题和基本数据结构操作。

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

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 源码

细节:

  1. 三步翻转法,翻转不用reverse函数的话,需要对向双指针来实现
  2. 找最小值的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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值