给定一个旋转排序数组,在原地恢复其排序。
样例
[4, 5, 1, 2, 3] -> [1, 2, 3, 4, 5]
挑战
使用O(1)的额外空间和O(n)时间复杂度
说明
什么是旋转数组?
比如,原始数组为[1,2,3,4], 则其旋转数组可以是[1,2,3,4], [2,3,4,1], [3,4,1,2], [4,1,2,3]
public class Solution {
/**
* @param nums: The rotated sorted array
* @return: void
*/
public void recoverRotatedSortedArray(ArrayList<Integer> nums) {
if(null == nums || nums.size() == 0) return;
int min = SearchMin(nums);
int len = nums.size();
int peek = (min + len - 1)%len;
if(peek == len - 1)return;
for(int i = 0; i < (peek + 1)/2; i++) {
int temp = nums.get(i);
nums.set(i, nums.get(peek - i));
nums.set(peek - i, temp);
}
for(int i = 0; i < (len - peek)/2; i++) {
int temp = nums.get(peek + 1 + i);
nums.set(peek + 1 + i, nums.get(len - 1 - i));
nums.set(len - 1 - i, temp);
}
for(int i = 0; i < len/2; i++) {
int temp = nums.get(i);
nums.set(i, nums.get(len - 1 - i));
nums.set(len - 1 - i, temp);
}
}
public int SearchMin(ArrayList<Integer> nums) {
int minNum = nums.get(0);
int min = 0;
for(int i = 1; i < nums.size(); i++) {
if(minNum > nums.get(i)) {
min = i;
minNum = nums.get(i);
}
}
return min;
}
//本题中未使用
public int binarySearchMin(ArrayList<Integer> nums) {//当ArrayList中元素无重复时可用该方法找到最小值
int low = 0;
int high = nums.size() - 1;
while(low < high) {
int mid = low + (high - low)/2;
if(nums.get(low) < nums.get(high)) return low;
if(nums.get(mid) > nums.get(high)) {
low = mid + 1;
}else {
high = mid;
}
}
return low;
}
}