IVW150-4-轮转数组
题目描述
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
示例 1:
1 | 输入: nums = [1,2,3,4,5,6,7], k = 3 |
进阶:
- 尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
- 你可以使用空间复杂度为
O(1)
的 原地 算法解决这个问题吗?
算法思路
我觉得想到几种比较简单的方法倒还是没问题的,比如:
- 每次将数组循环后移一位,重复
k%n
次,时间复杂度是$O(k\%n * n)$,空间复杂度是$O(1)$ - 拷贝一份新的数组,将两个数组拼接在一起,比如
nums=[1,2,3], k=1
,则生成新数组nums1=[1,2,3,1,2,3]
,直接取切片nums1[n-k-1, 2n-k-1]
即可,时间复杂度$O(n)$,空间复杂度$O(n)$
不过都没有达到题目的要求:时间复杂度$O(n)$,空间复杂度$O(1)$。于是我也不想在简单的算法浪费时间,就去看了官方的题解,我觉得写的非常好:
该方法基于如下的事实:当我们将数组的元素向右移动 k 次后,尾部
k % n
个元素会移动至数组头部,其余元素向后移动k % n
个位置。该方法为数组的翻转:我们可以先将所有元素翻转,这样尾部的
k % n
个元素就被移至数组头部,然后我们再翻转[0,k % n−1]
区间的元素和[k % n,n−1]
区间的元素即能得到最后的答案。
比如nums=[1,2,3,4,5,6,7], k=3
,先反转成[7,6,5,4,3,2,1]
,然后翻转[0-2]
得到[5,6,7,4,3,2,1]
,接着再翻转[3-6]
得到[5,6,7,1,2,3,4]
,代码如下:
1 | class Solution { |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.