题目描述
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
代码
-
新数组
时间复杂度: O(n)
空间复杂度: O(n)
void rotate(vector<int> &nums, int k) //k为右移动的距离
{
int n = nums.size();
vector<int> num(n);
for (int i = 0; i < n; i++)
{
num[(i+k)% n] = nums[i];
}
nums.assign(num.begin(),num.end());
}
- 反转
时间复杂度:O(2n) = O(n)
空间复杂度:O(1)
void rotate(vector<int> &nums, int k) //k为右移动的距离
{
reverse(nums.begin(), nums.end()); //数组整体颠倒
int pos = (0 + k) % nums.size(); //确定反转位置
reverse(nums,0,pos-1);
reverse(nums, pos, nums.size() - 1);
}
- 环状替换
时间复杂度:O(n)
空间复杂度:O(1)
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode-solution-nipk/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
void rotate(vector<int> &nums, int k) //k为右移动的距离
{
int n = nums.size(); //获取数组长度
int count = 1;
int start = 0;
while (count <= nums.size())
{
int current = start;
int prev = nums[start];
do
{
int next = (current + k) % n;
swap(nums[next], prev);
current = next;
count++;
} while (start != current);
}
}