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].
[分析] 用到的技巧,全局reverse再局部reverse完成偏移若干位操作。
public class Solution { // method 1: time O(N), space O(N) public void rotate1(int[] nums, int k) { if (nums == null || nums.length == 0 || k % nums.length == 0) return; int n = nums.length; k = k % n; int[] tmp = new int[k]; for (int i = 0; i < k; i++) { tmp[i] = nums[n - k + i]; } for (int i = n - k - 1; i >= 0; i--) { nums[i + k] = nums[i]; } for (int i = 0; i < k; i++) { nums[i] = tmp[i]; } } // method 2: time O(k * n), space O(1), timeout public void rotate2(int[] nums, int k) { if (nums == null || nums.length == 0 || k % nums.length == 0) return; int n = nums.length; k = k % n; if (k < n / 2) { for (int i = 0; i < k; i++) { int tmp = nums[n - 1]; for (int j = n - 1; j > 0; j--) { nums[j] = nums[j - 1]; } nums[0] = tmp; } } else { for (int i = 0; i < k; i++) { int tmp = nums[0]; for (int j = 0; j < n - 1; j++) { nums[j] = nums[j + 1]; } nums[n - 1] = tmp; } } } // method 3: time O(n), space O(1) public void rotate(int[] nums, int k) { if (nums == null || nums.length == 0 || k % nums.length == 0) return; int n = nums.length; k = k % n; reverse(nums, 0, n - 1); reverse(nums, 0, k - 1); reverse(nums, k, n - 1); } public void reverse(int[] nums, int left, int right) { while (left < right) { int tmp = nums[left]; nums[left] = nums[right]; nums[right] = tmp; left++; right--; } } }