Skip to content

轮转数组

理解题目:

题目要求将给定数组进行轮转,即将数组中的元素向右移动 k 步,其中 k 是非负数。

代码实现:

public class RotateArray {
    // 轮转数组
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        k = k % n; // 处理 k 大于数组长度的情况
        if (k == 0) return; // 如果 k 为 0,则无需进行任何操作

        reverse(nums, 0, n - 1); // 整体反转数组
        reverse(nums, 0, k - 1); // 反转前 k 个元素
        reverse(nums, k, n - 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--;
        }
    }
}

步骤解释:

  1. 计算出需要轮转的步数 k,如果 k 为 0,则无需进行任何操作。

  2. 对数组进行三次反转操作:

  3. 首先,整体反转整个数组,这样最后的 k 个元素会被移动到数组的开头。
  4. 然后,反转前 k 个元素,将它们移动到数组的末尾。
  5. 最后,反转剩余的元素,将它们移动到数组的开头。

  6. 完成三次反转操作后,数组完成了轮转。

时间复杂度: 时间复杂度为 O(n),其中 n 是数组的长度。整体反转数组、反转前 k 个元素和反转剩余的元素都需要 O(n) 的时间。

空间复杂度: 只使用了常数级别的额外空间,空间复杂度为 O(1)