LeetCode-189.轮转数组

链接:

189. 轮转数组 - 力扣(LeetCode) (leetcode-cn.com)

题设:

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

利用JAVA实现:

创建新数组来实现轮转:

class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        int[] newArr = new int[n];
        for (int i = 0; i < n; ++i) {
            newArr[(i + k) % n] = nums[i];
        }
        System.arraycopy(newArr, 0, nums, 0, n);
    }
}

其中的arraycopy方法:(数组复制)如何实现数组复制

时间复杂度: O(n),其中 n 为数组的长度。

空间复杂度: O(n)。

环转替换实现:

class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        k = k % n;
        int count = gcd(k, n);
        for (int start = 0; start < count; ++start) {
            int current = start;
            int prev = nums[start];
            do {
                int next = (current + k) % n;
                int temp = nums[next];
                nums[next] = prev;
                prev = temp;
                current = next;
            } while (start != current);
        }
    }

    public int gcd(int x, int y) {
        return y > 0 ? gcd(y, x % y) : x;
    }
}

时间复杂度:O(n),其中 n 为数组的长度。每个元素只会被遍历一次。

空间复杂度:O(1)。我们只需常数空间存放若干变量

两方法对比

 

LeetCode-189.轮转数组_第1张图片

你可能感兴趣的:(数据结构,LeetCode,java,leetcode)