给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 进阶: 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗? 示例 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 <= 2 * 104 -231 <= nums[i] <= 231 - 1 0 <= k <= 105 ``` 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/rotate-array 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Activity
zhangke666163 commentedon Jul 29, 2021
思路:复制一个新数组,将旧数组元素右移K个位置,替换到新数组对应位置,注意移动时数组越界问题。
时间、空间复杂度:O(n)
代码:
chuchumeme commentedon Jul 29, 2021
方法一:(通过了)
思路:
循环每一项,根据k值旋转放入新数组,再把新数组循环赋值给nums
复杂度
时间复杂度: 0(n) 空间复杂度: O(n)
代码:
方法二:(没过,超出时间限制)
思路:
通过while循环,将k减到0则旋转完成,数组进行弹出和插入
复杂度
时间复杂度: 0(n) 空间复杂度: O(n)
代码:
为啥超出时间限制了。。
xuezc1119 commentedon Jul 29, 2021
方法一
思路
通过给定的k将数组分成两部分
将这两部分逆向拼接起来
复杂度
时间复杂度O(n),空间复杂度O(n)
代码
方法二
思路
通过k确定数组第一位到最后一位的新位置
剩余的数据前移
复杂度
时间复杂度O(n),空间复杂度O(n)
代码
lyonyang commentedon Aug 7, 2021
思路一 - 切片拼接
以倒数第$O(N)$ 而不是 $O(1)$)
k位置为分界线 , 用切片切分出两个数组 , 再拼接两个数组 , 由于要求在原地操作所以最后再进行一下复制 (但是这样的话空间复杂度为注意 :
k可能大于数组长度时间复杂度:$O(N)$ ,
N为数组长度空间复杂度:$O(N)$
思路二 - 环形换位
向右移动
k个位置 , 或者是向左移动nums.length - k个位置向左换位 : 从尾部开始遍历 , 将第
i个元素与第i - nums.length - k个元素互换 , 互换之前需要将被互换的位置的元素用变量存储起来再作为下一个换位的元素继续重复操作 , 整个换位过程刚好形成一个环向右换位 : 从头部开始遍历 , 将第
i个元素与第i + k个元素互换 , 互换之前同样需要将被互换的位置的元素用变量存储起来再作为下一个换位的元素继续重复操作 , 整个换位过程刚好形成一个环注意 :
k可能大于数组长度k % len(nums) == 0表示数组不移动时间复杂度:$O(N)$ ,
N为数组长度空间复杂度:$O(1)$
思路三 - 三次反转
向右移
k个位置 , 就是把从len(nums) - k到len(nums) -1的这段数组 , 与从0到len(nums) - k - 1这段数组调换一下位置 , 那我们可以 :时间复杂度:$O(N)$ ,
N为数组长度空间复杂度:$O(1)$