Question

Formatted question description: https://leetcode.ca/all/189.html

 189. Rotate Array

 Given an array, rotate the array to the right by k steps, where k is non-negative.

 Example 1:

 Input: [1,2,3,4,5,6,7] and 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: [-1,-100,3,99] and 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]

 Note:
 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?

 @tag-array

Algorithm

O(1) extra space.

Similar to the method of flipping characters, the idea is to

  1. flip the first n-k numbers first,
  2. then flip the last k numbers,
  3. and finally flip the entire array.

Proces as below:

[1,2,3,4, 5,6,7] => [4,3,2,1, 5,6,7]

[4,3,2,1, 5,6,7] => [4,3,2,1, 7,6,5]

[4,3,2,1, 7,6,5] => [5,6,7, 1,2,3,4]

Code

Java

  • import org.apache.commons.lang3.ArrayUtils;
    
    public class Rotate_Array {
    
        class Solution {
            public void rotate(int[] nums, int k) {
                if (nums.length == 0 || (k %= nums.length) == 0) {
                    return;
                }
    
                int n = nums.length;
    
                // [1,2,3,4,5,6,7] => [4,3,2,1,5,6,7]
                ArrayUtils.reverse(nums, 0, n - k); // @note: org.apache.commons.lang3.ArrayUtils
    
                // [4,3,2,1,5,6,7] => [4,3,2,1,7,6,5]
                ArrayUtils.reverse(nums, n - k, nums.length);
    
                // [4,3,2,1,7,6,5] => [5,6,7,1,2,3,4]
                ArrayUtils.reverse(nums, 0, nums.length);
            }
        }
    
        class Solution_kTimesAllItemsMoving {
            public void rotate(int[] nums, int k) {
    
                while ( k > 0) {
                    k--;
    
                    int tmp = nums[nums.length - 1]; // last one
                    for (int i = nums.length - 1; i >= 1; i--) {
                        nums[i] = nums[i - 1];
                    }
    
                    nums[0] = tmp;
                }
            }
        }
    }
    
  • // OJ: https://leetcode.com/problems/rotate-array/
    // Time: O(N)
    // Space: O(K)
    class Solution {
    public:
        void rotate(vector<int>& A, int k) {
            int N = A.size();
            k %= N;
            if (k == 0) return;
            vector<int> tmp(k);
            for (int i = 0; i < k; ++i) tmp[i] = A[N + i - k];
            for (int i = N - k - 1; i >= 0; --i) A[i + k] = A[i];
            for (int i = 0; i < k; ++i) A[i] = tmp[i];
        }
    };
    
  • class Solution(object):
      def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        if len(nums) == 0 or k == 0:
          return
    
        def reverse(start, end, s):
          while start < end:
            s[start], s[end] = s[end], s[start]
            start += 1
            end -= 1
    
        n = len(nums) - 1
        k = k % len(nums)
        reverse(0, n - k, nums)
        reverse(n - k + 1, n, nums)
        reverse(0, n, nums)
    
    

All Problems

All Solutions