Given an integer array nums, rotate the array to the right by k steps, where k is non-negative.
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]
Constraints:
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
0 <= k <= 105
Follow up:
Try to come up with as many solutions as you can. There are at least three different ways to solve this problem.
Could you do it in-place with O(1) extra space?
Solutions
Solution 1: Reverse three times
We can assume the length of the array is \(n\) and calculate the actual number of steps needed by taking the module of \(k\) and \(n\), which is \(k \bmod n\).
Next, let us reverse three times to get the final result:
Reverse the entire array.
Reverse the first \(k\) elements.
Reverse the last \(n - k\) elements.
For example, for the array \([1, 2, 3, 4, 5, 6, 7]\), \(k = 3\), \(n = 7\), \(k \bmod n = 3\).
In the first reverse, reverse the entire array. We get \([7, 6, 5, 4, 3, 2, 1]\).
In the second reverse, reverse the first \(k\) elements. We get \([5, 6, 7, 4, 3, 2, 1]\).
In the third reverse, reverse the last \(n - k\) elements. We get \([5, 6, 7, 1, 2, 3, 4]\), which is the final result.
The time complexity is \(O(n)\), where \(n\) is the length of the array. The space complexity is \(O(1)\).
/** Do not return anything, modify nums in-place instead. */functionrotate(nums:number[],k:number):void{constn:number=nums.length;k%=n;constreverse=(i:number,j:number):void=>{for(;i<j;++i,--j){constt:number=nums[i];nums[i]=nums[j];nums[j]=t;}};reverse(0,n-1);reverse(0,k-1);reverse(k,n-1);}