【算法题】轮转数组

发布时间 2023-10-15 00:31:52作者: 影麟

?题目链接

?题目描述

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

?数据范围

  • 1 <= nums.length <= \(10^5\)
  • \(-2^{31}\) <= nums[i] <= \(2^{31}\) - 1
  • 0 <= k <= \(10^5\)

?方法1

使用辅助数组记录移出的元素,然后再将元素移到开头。

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function(nums, k) {
    let tk=k%nums.length;
    let temp=[];
    while(tk--){
        temp.unshift(nums.pop());
    }
    nums.unshift(...temp);
};

unshift时间复杂度为\(O(n)\)

时间复杂度:\(O(n^2)\)

空间复杂度:\(O(tk)\)

?方法2

使用splice方法,将数组后面的元素移动到数组前面。

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function(nums, k) {
    let tk=k%nums.length;
    nums.unshift(...nums.splice(nums.length-tk,tk));
}

时间复杂度:\(O(n)\)

空间复杂度:\(O(tk)\)

?方法3

先将整个数组反转,然后将前k个元素反转,再将后面的元素反转。

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var reverse=function(nums,start,end){
    while(start<end){
        let temp=nums[start];
        nums[start]=nums[end];
        nums[end]=temp;
        start++;
        end--;
    }
}
var rotate = function(nums, k) {
    let tk=k%nums.length;
    reverse(nums,0,nums.length-1);
    reverse(nums,0,tk-1);
    reverse(nums,tk,nums.length-1);
};

时间复杂度:\(O(n)\)

空间复杂度:\(O(1)\)