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); }
我是用这个过的,注意在循环的时候慎用迭代器进行插删,如果明白自己在做什么还是用下标比较稳
对于第三种写个倒转函数然后调用就可以了,没什么好贴的,实现也很容易。