恢复旋转的数组
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.
Solution:
Collections.sort(nums);
public void recoverRotatedSortedArray(ArrayList<Integer> nums) {
if (nums == null || nums.size() == 0) {
return;
}
int split = -1;
for (int i = 0; i < nums.size() - 1; i++) {
if (nums.get(i) > nums.get(i + 1)) {
split = i;
break;
}
}
if (split >= 0) {
for (int i = 0; i < (split + 1) / 2; i++) {
int temp = nums.get(i);
nums.set(i,nums.get(split - i));
nums.set(split - i, temp);
}
for (int i = split + 1; i < (nums.size() - (split + 1)) / 2 + split + 1; i++) {
int temp = nums.get(i);
nums.set(i,nums.get(nums.size() - 1 - (i - (split + 1))));
nums.set(nums.size() - 1 - (i - (split + 1)), temp);
}
for (int i = 0; i < nums.size() / 2; i++) {
int temp = nums.get(i);
nums.set(i,nums.get(nums.size() - 1 - i));
nums.set(nums.size() - 1 - i, temp);
}
}
}
public void recoverRotatedSortedArray(ArrayList<Integer> nums) {
if (nums == null || nums.size() <= 1) {
return;
}
for (int i = 0; i < nums.size() - 1; i++) {
if (nums.get(i) > nums.get(i + 1)) {
reverse(nums, 0, i);
reverse(nums, i + 1, nums.size() - 1);
reverse(nums, 0, nums.size() - 1);
break;
}
}
}
private void reverse(ArrayList<Integer> nums, int start, int end) {
for (int i = start, j = end; i < j; i++, j--) {
int temp = nums.get(i);
nums.set(i, nums.get(j));
nums.set(j, temp);
}
}
思路:
1. 三步翻转法。[4,5,1,2,3] 找到分割点 split(5),两段各自翻转([5,4][3,2,1]),最后一起翻转[1,2,3,4,5]。翻转时只要遍历一半即可。
[4, 5, 1, 2, 3]
[5, 4, 3 ,2, 1]
[1, 2, 3, 4, 5]
2. 双index法,首尾各一个,首要小于尾。