Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7]
is rotated to [5,6,7,1,2,3,4]
.
介绍2种方法,一种空间复杂度为O ( k ), 另一种inplace。
先介绍简单的解法1:
进行观察后,可以想到一种解决方案。
1. 利用额外k空间 (这里 k = 3) , 存储[5, 6, 7 ]
2. 将前面的[1, 2, 3, 4] 后移k 位。此时array变成 [1, 2, 3, 1, 2, 3, 4]
3. 利用存储的值,来更新array 前 k 个值,最后array变成[5, 6, 7, 1, 2, 3, 4]
复杂度:
时间复杂度:O ( n )
空间复杂度:O ( k )
时间:
下面介绍inplace的解法2:
1. 先将原始array全部reverse,原始array变成 [7, 6, 5, 4, 3, 2, 1]
2. 一部分前面的array reverse, index[0...k-1]的, array变成[5, 6, 7, 4, 3, 2, 1]
3. 将后半部分array reverse, index[k ... n - 1]的,n为原始array的length, array变成[5, 6, 7, 1, 2, 3, 4]
复杂度:
时间复杂度:O ( n )
空间复杂度:O ( 1 )
时间:
代码:
public void rotateInplace(int[] nums, int k) {
int n = nums.length;
k = k % n;
reverse(nums, 0, n - 1); // reverse whole
reverse(nums, 0, k - 1); // reverse second part
reverse(nums, k, n - 1); // reverse first part
}
private void reverse(int[] nums, int lo, int hi) {
while (lo < hi) {
int temp = nums[lo];
nums[lo++] = nums[hi];
nums[hi--] = temp;
}
}
参考:
https://leetcode.com/discuss/95631/java-o-n-in-place-solution