【Leetcode】189. 旋转数组

275 阅读1分钟

题目描述

在这里插入图片描述

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

进阶:

尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?

题解

翻转数组法

翻转数组其实就是头尾指针互换元素,然后头尾指针向中间遍历,如此循环。我们需要旋转数组,其实只需要做三次旋转即可。

执行用时0 ms, 在所有 Java 提交中击败了100.00%的用户

内存消耗:55.3 MB, 在所有 Java 提交中击败了38.26%的用户

通过测试用例:8 / 38

class Solution {
    public void rotate(int[] nums, int k) {
        if (nums.length <= k) {
            k = k % nums.length;
        }
        reverseOrder(nums, 0, nums.length - 1);
        reverseOrder(nums, 0, k - 1);
        reverseOrder(nums, k, nums.length - 1);
    }
    
    public void reverseOrder(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start += 1;
            end -= 1;
        }
    }
}