【LeetCode Hot100】189.轮转数组-三种解法以及效果评估

【LeetCode Hot100】189.轮转数组-三种解法以及效果评估

题目描述

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

示例 1:
输入: nums = [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]

示例 2:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

提示:
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
0 <= k <= 105

不管轮转几步会发现,数组总是像是被分成了左右两份,有一个断点的感觉

方法一(针对原数组去找那个断点)

从原数组找到断点之后,从断点开始往后push进新数组
然后再从原数组第一位开始push进新数组

varrotate=function(nums,k){constlen=nums.length;k=k%len;constnewArr=[];for(leti=len-k;i<len;i++){newArr.push(nums[i])}for(leti=0;i<len-k;i++){newArr.push(nums[i])}for(leti=0;i<len;i++){nums[i]=newArr[i]}};

效果评估:

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

方法二(针对新数组去找那个断点)


原数组都是从第一位开始遍历,然后从新数组的断点位置开始push数据

varrotate=function(nums,k){constlen=nums.length;k=k%len;constnewArr=newArray(len);for(leti=0;i<len;i++){letidx=(i+k)%len;newArr[idx]=nums[i];}for(leti=0;i<len;i++){nums[i]=newArr[i];}};

效果评估:

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

方法三

https://leetcode.cn/problems/rotate-array/solutions/551039/xuan-zhuan-shu-zu-by-leetcode-solution-nipk/?envType=study-plan-v2&envId=top-100-liked
力扣官方题解方法二:环状替换