题目描述:
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
进阶:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题分析:
空间复杂度为O(1):
1.翻转所有元素
2.翻转 [0, k mod n−1] 区间的元素
3.翻转 [k mod n−1,nums.size()-1] 区间的元素
class Solution {
public:
void rotate(vector<int>& nums, int k) {
if(nums.size()<=1)
return ;
if(k>nums.size())
k=k%nums.size();
reverse(nums, 0, nums.size()-1);
reverse(nums, 0, k-1);
reverse(nums, k, nums.size()-1);
return ;
}
void reverse(vector<int>& nums, int start, int end){
while(start<end){
int temp=nums[start];
nums[start]=nums[end];
nums[end]=temp;
start++;
end--;
}
return ;
}
};
空间复杂度为O(n):
将原数组下标为 ii 的元素放至新数组下标为 (i+k) mod n 的位置
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
vector<int> newArr(n);
for (int i = 0; i < n; ++i) {
newArr[(i + k) % n] = nums[i];
}
nums.assign(newArr.begin(), newArr.end());
}
};