题目地址:
https://www.lintcode.com/problem/recover-rotated-sorted-array/description
给定一个旋转数组,要求将其复原。旋转数组指的是一个有序数组向右移动若干位,尾部的数字填充到开头。例如将 ( 1 , 2 , 3 , 4 ) (1,2,3,4) (1,2,3,4)右移 2 2 2位就变成了 ( 1 , 2 , 3 , 4 ) → ( 4 , 1 , 2 , 3 ) → ( 3 , 4 , 1 , 2 ) (1,2,3,4)\to (4,1,2,3)\to (3,4,1,2) (1,2,3,4)→(4,1,2,3)→(3,4,1,2)。复原的含义是,将其重新变为有序数组。
思路是先找到第一个数组下降的位置,这个位置的数就是整个数组的最大值,并且其前和其后都是有序的。接下来就可以用“三步翻转法”来将其复原。代码如下:
import java.util.Collections;
import java.util.List;
public class Solution {
/**
* @param nums: An integer array
* @return: nothing
*/
public void recoverRotatedSortedArray(List<Integer> nums) {
// write your code here
if (nums == null || nums.isEmpty()) {
return;
}
for (int i = 0; i < nums.size() - 1; i++) {
// 先找到下降的位置
if (nums.get(i) > nums.get(i + 1)) {
// 然后翻转三次
flip(nums, 0, i);
flip(nums, i + 1, nums.size() - 1);
flip(nums, 0, nums.size() - 1);
}
}
}
private void flip(List<Integer> nums, int i, int j) {
while (i < j) {
Collections.swap(nums, i++, j--);
}
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。