Q
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
进阶:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
A
使用额外的数组
1 |
|
思路
使用额外的数组来将每个元素放至正确的位置。用 n 表示数组的长度,遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i+k)modn 的位置,最后将新数组拷贝至原数组即可。时间复杂度
时间复杂度:O(n),其中 n 为数组的长度。空间复杂度
空间复杂度:O(n)。
数组翻转
1 | class Solution { |
- 思路
该方法基于如下的事实:当我们将数组的元素向右移动 kk 次后,尾部 kmodn 个元素会移动至数组头部,其余元素向后移动 kmodn 个位置。
该方法为数组的翻转:可以先将所有元素翻转,这样尾部的 kmodn 个元素就被移至数组头部,然后再翻转 [0,kmodn−1] 区间的元素和 [kmodn,n−1] 区间的元素即能得到最后的答案。
1 | nums = "----->-->"; k =3 |
时间复杂度:O(n),其中 n 为数组的长度。每个元素被翻转两次,一共 n 个元素,因此总时间复杂度为 O(2n)=O(n)。
空间复杂度:O(1)。
环状替换
官方解答最优解法 暂时没整明白