力扣算法189:轮转数组 —— 进阶版:空间复杂度 O(1)

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

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]


为了解决这个问题,我们需要将数组中的元素向右轮转 k 个位置。其实可以使用多种方法来实现这个目标,但这里提供一种最高效的方法,空间复杂度为 O( 1 ),即通过反转数组的特定部分来实现轮转。

核心思路:

首先,反转整个数组。

然后,反转前 k 个元素。

最后,反转剩余的元素。

为什么能这么做呢?可以观察这个题结果的规律。

对于原数组 [1, 2, 3, 4, 5, 6, 7],结果数组为 [5, 6, 7, 1, 2, 3, 4]

我们先把原数组元素全部反转一遍得到 **[7, 6, 5, 4, 3, 2, 1]**。

然后观察它,发现前K个元素(7, 6, 5)再反转一遍得到(5, 6, 7),剩下的元素(4, 3, 2, 1)再反转一遍得到(1, 2, 3, 4)。

把(5, 6, 7)与(1, 2, 3, 4 )连起来不就是结果数组嘛

我的 Java 代码:

public class Solution {
    public void rotate(int[] nums, int k) {
        if (nums == null || nums.length == 0) {
            return;
        }
        
        int n = nums.length;
        k = k % n; // 处理 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 start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }
}

对于输入 nums = [1, 2, 3, 4, 5, 6, 7] 和 k = 3,程序的运行过程如下:

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

  2. 反转前 3 个元素:[5, 6, 7, 4, 3, 2, 1]

  3. 反转剩余的元素:[5, 6, 7, 1, 2, 3, 4]

最终,数组变为 [5, 6, 7, 1, 2, 3, 4]

posted @ 2025-07-24 15:12  junjunyi  阅读(21)  评论(0)    收藏  举报