Given a rotatedsorted array, recover it to sorted array in-place.
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]
Example
[4, 5, 1, 2, 3]
-> [1, 2, 3, 4, 5]
思路是三次反转数组,第一次反转以后用一个o(n)时间找到要反转的点,然后再对index的左右两侧进行两次反转。
代码:
public void recoverRotatedSortedArray(ArrayList<Integer> nums) {
// write your code
if(nums == null || nums.size() == 0) return;
Collections.reverse(nums);
int index= -1;
for(int i=0;i<nums.size()-1;i++){
if(nums.get(i)<nums.get(i+1)){
//i is the place where need to split
index = i;
break;
}
}
if(index != nums.size()){
//Collcetions.reverse()
reverse(nums, 0, index);
reverse(nums, index+1, nums.size()-1);
}else{
Collections.reverse(nums);
}
}
private void reverse(ArrayList<Integer> nums, int i, int j){
while(i<j){
int temp = nums.get(i);
nums.set(i, nums.get(j));
nums.set(j, temp);
i++;j--;
}
}