Given an array, rotate the array to the right by k steps, where k is non-negative.
Follow up:
- Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
- Could you do it in-place with O(1) extra space?
Example 1:
Input: nums = [1,2,3,4,5,6,7], k = 3 Output: [5,6,7,1,2,3,4] Explanation: rotate 1 steps to the right: [7,1,2,3,4,5,6] rotate 2 steps to the right: [6,7,1,2,3,4,5] rotate 3 steps to the right: [5,6,7,1,2,3,4]
Example 2:
Input: nums = [-1,-100,3,99], k = 2 Output: [3,99,-1,-100] Explanation: rotate 1 steps to the right: [99,-1,-100,3] rotate 2 steps to the right: [3,99,-1,-100]
思路:三步法,先局部反转,然后整体反转;
class Solution {
public void rotate(int[] nums, int k) {
if(nums == null || nums.length == 0) {
return;
}
int n = nums.length;
if(k % n == 0) {
return;
}
k = k % n;
swapList(nums, 0, n - k - 1);
swapList(nums, n - k, n - 1);
swapList(nums, 0, n - 1);
}
private void swapList(int[] A, int i, int j) {
while(i < j) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
i++;
j--;
}
}
}