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 {
void swap(vector<int> &num, int i, int j) {
if (i != j) {
int tmp = num[i];
num[i]= num[j];
num[j] = tmp;
}
}
void reverse(vector<int> &num, int i, int j) {
while(i < j) {
swap(num, i, j);
i++;
j--;
}
}
int findMinPoint(vector<int> &A) {
int l = 0, r = A.size()-1;
if (A[l] < A[r]) return l;
while(l < r) {
int m = (l+r)/2;
if (A[m] < A[r])
r = m;
else
l = m+1;
}
return r;
}
public:
void recoverRotatedSortedArray(vector<int> &nums) {
int i = findMinPoint(nums);
if (i == 0) return;
reverse(nums, 0, i-1);
reverse(nums, i, nums.size()-1);
reverse(nums, 0, nums.size()-1);
}
};
class Solution { void swap(vector<int> &num, int i, int j) { if (i != j) { int tmp = num[i]; num[i]= num[j]; num[j] = tmp; } } int findMinPoint(vector<int> &A) { int l = 0, r = A.size()-1; if (A[l] < A[r]) return l; while(l < r) { int m = (l+r)/2; if (A[m] < A[r]) r = m; else l = m+1; } return r; } public: void recoverRotatedSortedArray(vector<int> &nums) { int k = findMinPoint(nums); if (k == 0) return; int n = nums.size(); int i = 0; int L = n; while(k > 0) { while(i+k <n) { swap(nums, i, i+k); i++; } int t = k; k = L%k? k - L%k : 0; L = t; } } };
No comments:
Post a Comment