39. 恢复旋转排序数组

给定一个旋转排序数组,在原地恢复其排序。

说明

什么是旋转数组?

  • 比如,原始数组为[1,2,3,4], 则其旋转数组可以是[1,2,3,4], [2,3,4,1], [3,4,1,2], [4,1,2,3]
样例

[4, 5, 1, 2, 3] -> [1, 2, 3, 4, 5]

挑战 

使用O(1)的额外空间和O(n)时间复杂度

不管什么解法,找到最小的数都是有必要的

可以用二分也可以直接遍历,毕竟要求O(n),为了方便直接遍历吧

然后就有这么几个思路:

1、把后面接到前面去

2、把前面接到后面去

3、前全部倒转,后全部倒转,再整体全部倒转(很有意思)

对于第一种

 1 void recoverRotatedSortedArray(vector<int> &nums) {
 2     // write your code here
 3     int size = nums.size();
 4     vector<int>::iterator it1, it2;
 5     it1 = nums.begin();
 6     it2 = nums.begin() + 1;
 7     while (*it1<*it2) {
 8         it1++;
 9         it2++;
10     }
11     nums.insert(nums.begin(), it2, nums.end());
12     nums.resize(size);
13 }

我很不明白为什么这个解法WA,明明可以在VS2017里面过,望高人解答

对于第二种

void recoverRotatedSortedArray(vector<int> &nums) {
    // write your code here
        if(nums[nums.size()-1]>nums[0]){
            return;
        }
        int size = nums.size();
        int index1 = 0, index2 = 1;;
        while (nums[index1]<=nums[index2]) {
            index1++;
            index2++;
        }
        index1 = 0;
        while (index1<index2) {
            nums.push_back(nums[index1++]);
        }
        nums.erase(nums.begin(), nums.begin()+index2);
    }

我是用这个过的,注意在循环的时候慎用迭代器进行插删,如果明白自己在做什么还是用下标比较稳

对于第三种写个倒转函数然后调用就可以了,没什么好贴的,实现也很容易。

原文地址:https://www.cnblogs.com/TheLaughingMan/p/8239682.html