Given a rotated sorted array, recover it to sorted array in-place.
Example
[4, 5, 1, 2, 3]
-> [1, 2, 3, 4, 5]
Challenge
In-place, O(1) extra space and O(n) time.
Clarification
What is rotated array?
- For example, the orginal array is [1,2,3,4], The rotated array of it can be [1,2,3,4], [2,3,4,1], [3,4,1,2], [4,1,2,3]
class Solution {
private:
void swap(vector<int> &nums, int p1, int p2)
{
int tmp = nums[p1];
nums[p1] = nums[p2];
nums[p2] = tmp;
}
void RotedImpl(vector<int> &nums, int begin, int end) {
if (nums.size() == 0 || begin == end)
return;
int front = begin;
int rear = end;
while (front < rear)
{
swap(nums, front, rear);
front++;
rear--;
}
}
public:
void recoverRotatedSortedArray(vector<int> &nums) {
// write your code here
int curIdx = 0;
while (curIdx < nums.size()-1)
{
if (nums[curIdx] > nums[curIdx+1])
{
break;
}
curIdx++;
}
if (curIdx != nums.size()-1)
{
RotedImpl(nums, 0, curIdx);
RotedImpl(nums, curIdx+1, nums.size()-1);
RotedImpl(nums, 0, nums.size()-1);
}
}
};