Skip to content

Latest commit

 

History

History
 
 

189. Rotate Array

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

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]

 

Constraints:

  • 1 <= nums.length <= 2 * 104
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

Related Topics:
Array

Similar Questions:

Solution 1.

// OJ: https://leetcode.com/problems/rotate-array/
// Author: github.com/lzl124631x
// 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];
    }
};

Solution 2.

// OJ: https://leetcode.com/problems/rotate-array/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1)
class Solution {
public:
    void rotate(vector<int>& A, int k) {
        int cnt = 0, N = A.size();
        k %= N;
        if (k == 0) return;
        for (int i = 0; cnt < N; ++i) {
            int j = i, tmp = A[j];
            do {
                int t = (j + k) % N, next = A[t];
                A[t] = tmp;
                tmp = next;
                j = t;
                ++cnt;
            } while (j != i);
        }
    }
};

Solution 3.

// OJ: https://leetcode.com/problems/rotate-array/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1)
class Solution {
public:
    void rotate(vector<int>& A, int k) {
        k = (2 * A.size() - k) % A.size();
        if (k == 0) return;
        reverse(begin(A), begin(A) + k);
        reverse(begin(A) + k, end(A));
        reverse(begin(A), end(A));
    }
};