leetcode 算法题189 (简单045) 旋转数组

leetcode 算法题189 (简单045) 旋转数组

  • 题目介绍
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
  • 示例

输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释: 向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]

输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释: 向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]

  • 说明

尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。

要求使用空间复杂度为 O(1) 的 原地 算法。

  • 解法一
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function(nums, k) {
  k = k % nums.length;
  while (k-- > 0) {
    let i = nums.length - 1,
      temp = nums[nums.length - 1];
    while (i > 0) {
      nums[i] = nums[--i];
    }
    nums[i] = temp;
  }
  return nums;
};

执行用时 : 336 ms, 在所有 JavaScript 提交中击败了5.00%的用户

内存消耗 : 35 MB, 在所有 JavaScript 提交中击败了82.08%的用户

  • 解法二

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

执行用时 : 96 ms, 在所有 JavaScript 提交中击败了81.69%的用户

内存消耗 : 35.2 MB, 在所有 JavaScript 提交中击败了45.44%的用户

  • 解法三

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

执行用时 : 84 ms, 在所有 JavaScript 提交中击败了97.66%的用户

内存消耗 : 35.1 MB, 在所有 JavaScript 提交中击败了66.67%的用户

  • 解法四


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

执行用时 : 104 ms, 在所有 JavaScript 提交中击败了68.10%的用户

内存消耗 : 35.4 MB, 在所有 JavaScript 提交中击败了33.18%的用户

你可能感兴趣的:(#,leetcode,简单,leetcode)