难度:中等
题目描述
给定一个整数数组 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]
思路
这道题是目前做过用时最长的一道题了!改了二十来次代码才通过。一定要注意使用for循环时有没有越界,以及有没有超时。这道题有一个需要注意的点是向右轮转,不要看错或想错了(比如我的第一个代码写成了向左轮转),还有一个可以简化的地方:看k的值,使用k%n简化k值(n为数组元素个数),因为当元素个数为7时,向右轮转一个位置与向右轮转八个位置得到的结果是一样的,我们可以用这种思路控制k的大小。
可以使用额外数组,定义一个新的数组。对于前k%n个元素,新的数组前k%n个元素可以被覆盖为原数组的元素:新数组第i个元素被覆盖为原数组第i+n-k%n个元素,很好理解,对于n=7,k=4的情况,new[0]=old[3],new[1]=old[4],new[2]=old[5],new[3]=old[6]。对于后面剩余元素,新数组第i个元素被覆盖为原数组的第i-k%n个元素,对于n=7,k=4的情况,new[4]=old[0],new[5]=old[1]......
代码
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n=nums.size();
int m=k%n;
vector<int> nums1(n);
for(int i=0;i<m;i++){
nums1[i]=nums[i+n-m];
}
for(int i=m;i<n;i++){
nums1[i]=nums[i-m];
}
nums=nums1;
}
};
复杂度
-
时间复杂度: O(n)。
-
空间复杂度: O(n)。