189. 轮转数组
3 min
题目
解法:翻转数组
思路
核心思想是利用三次翻转操作实现轮转:先整体翻转,再翻转前k个元素,最后翻转剩余元素。
正确性基于位置映射原理:整体翻转将原数组的后k位移到前部(但顺序颠倒),前k个翻转恢复原后k位的顺序,剩余翻转恢复原前n-k位的顺序。该操作等价于轮转,且不丢失任何元素位置信息。
- Step 1: 计算实际轮转步数 k %= n(避免无效旋转)
- Step 2: 翻转整个数组(reverse(nums.begin(), nums.end()))
- Step 3: 翻转前k个元素(reverse(nums.begin(), nums.begin() + k))
- Step 4: 翻转剩余元素(reverse(nums.begin() + k, nums.end()))
复杂度
- 时间复杂度: ,三次线性翻转操作,每个元素被访问常数次。
- 空间复杂度: ,仅使用常数级额外变量(n, k)。
代码
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
k %= n;
reverse(nums.begin(), nums.end());
reverse(nums.begin(), nums.begin() + k);
reverse(nums.begin() + k, nums.end());
}
};