【leetcode】189. 轮转数组

57 阅读1分钟

leetcode-189.png

翻转

var rotate = function (nums, k) {
    let len = nums.length
    k = k % len
    reverse(nums, 0, len - 1)
    reverse(nums, 0, k - 1)
    reverse(nums, k, len - 1)
};
var reverse = function (nums, start, end) {
    while (start < end) {
        // swap
        [nums[start], nums[end]] = [nums[end], nums[start]]
        start++
        end--
    }
}
  • 时间复杂度O(n),其中 n 是数组的长度。每次翻转都需要遍历数组的一部分,总共三次翻转,因此时间复杂度为 O(n)

  • 空间复杂度O(1),不需要额外的空间,仅仅是原地修改数组。

耿直超时写法

var rotate = function (nums, k) {
    var oneRound = function () {
        let last = nums[nums.length - 1];
        for (let i = nums.length - 1; i > 0; --i) {
            nums[i] = nums[i - 1];
        }
        nums[0] = last;
    };

    for (let i = 0; i < k; ++i) {
        oneRound();
    }
};

“原地”操作

空间复杂度为O(n)

var rotate = function (nums, k) {
    let n = nums.length;
    let res = new Array(n);
    for (let i = 0; i < n; ++i) {
        res[(i + k) % n] = nums[i];
    }
    for (let i = 0; i < n; ++i) {
        nums[i] = res[i];
    }
};