轮转数组

轮转数组

理解题目:

题目要求将给定数组进行轮转,即将数组中的元素向右移动 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. 对数组进行三次反转操作:

    • 首先,整体反转整个数组,这样最后的 k 个元素会被移动到数组的开头。
    • 然后,反转前 k 个元素,将它们移动到数组的末尾。
    • 最后,反转剩余的元素,将它们移动到数组的开头。
  3. 完成三次反转操作后,数组完成了轮转。

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

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

阅读原文(原创博客)↗ ← 返回资讯列表

读者留言

COMMENTS 暂无
仅本站原创文章开放留言 · 请勿留下手机号、邮箱等个人信息

还没有留言,来说第一句?