32. Rotate Array
Given an integer array nums, rotate the array to the right by k steps, where k is non-negative. Modify the array in-place.
Examples:
Input: nums = [1,2,3,4,5,6,7], k = 3
Output: [5,6,7,1,2,3,4]
Explanation: Rotate right 3 steps: [7,1,2,3,4,5,6] -> [6,7,1,2,3,4,5] -> [5,6,7,1,2,3,4]
Input: nums = [-1,-100,3,99], k = 2
Output: [3,99,-1,-100]Problem Breakdown:
- First, handle the case where k is larger than the array length by taking k % n. A full rotation returns the array to its original state.
k = k % len(nums)- The trick is to use three reverse operations. First reverse the entire array.
def reverse(arr, start, end): while start < end: arr[start], arr[end] = arr[end], arr[start] start += 1 end -= 1- Reverse the entire array, then reverse the first k elements, then reverse the remaining elements.
reverse(nums, 0, len(nums) - 1) # Reverse all reverse(nums, 0, k - 1) # Reverse first k reverse(nums, k, len(nums) - 1) # Reverse rest
Summary:
Use the three-reverse trick: reverse the whole array, then reverse the first k elements, then reverse the rest. This achieves an in-place rotation in O(n) time with O(1) space.
Time and Space Complexity:
Time Complexity: O(n) - each element is visited a constant number of times.
Space Complexity: O(1) - rotation is done in-place.
Python Solution:
def rotate(nums, k):
def reverse(start, end):
while start < end:
nums[start], nums[end] = nums[end], nums[start]
start += 1
end -= 1
k = k % len(nums)
reverse(0, len(nums) - 1)
reverse(0, k - 1)
reverse(k, len(nums) - 1)JavaScript Solution:
var rotate = function(nums, k) {
k = k % nums.length;
const reverse = (start, end) => {
while (start < end) {
[nums[start], nums[end]] = [nums[end], nums[start]];
start++;
end--;
}
};
reverse(0, nums.length - 1);
reverse(0, k - 1);
reverse(k, nums.length - 1);
};Java Solution:
class Solution {
public void rotate(int[] nums, int k) {
k = k % nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
}
private void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
}