189 轮转数组

一、题目

189. 轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

![](/leetcode/assets/189. 轮转数组.png)

二、题解

三次反转

向右轮转 k 步,本质上是:[1,2,3,4,5,6,7]最后 k 个数移动到前面:[5,6,7] + [1,2,3,4]

可以用三次反转完成:

原数组:[1,2,3,4,5,6,7]

第一步:反转整个数组[7,6,5,4,3,2,1]

第二步:反转前 k 个元素[5,6,7,4,3,2,1]

第三步:反转剩下的元素[5,6,7,1,2,3,4]

class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;

        // 防止 k 大于数组长度
        k = k % n;

        // 1. 反转整个数组
        reverse(nums, 0, n - 1);

        // 2. 反转前 k 个元素
        reverse(nums, 0, k - 1);

        // 3. 反转剩下的元素
        reverse(nums, k, n - 1);
    }

    private void reverse(int[] nums, int left, int right) {
        while (left < right) {
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;

            left++;
            right--;
        }
    }
}

时间复杂度O(n)O(n)

空间复杂度O(1)O(1)

评论