class Solution {
public:
vector<int> solve(int n, int m, vector<int>& a) {
//取余,因为每次长度为n的旋转数组相当于没有变化
m = m % n;
//第一次逆转全部数组元素
reverse(a.begin(), a.end());
//第二次只逆转开头m个
reverse(a.begin(), a.begin() + m);
//第三次只逆转结尾m个
reverse(a.begin() + m, a.end());
return a;
}
};
- 计算实际移动距离:由于 M 可能大于数组长度 n,实际有效的移动距离是 M % n
- 三次反转:反转整个数组 反转前 M 个元素 反转后 N-M 个元素
这种方法的时间复杂度是 O(n),空间复杂度是 O(1),且每个元素只被移动了两次。
class Solution {
public:
vector<int> solve(int n, int m, vector<int>& a) {
if (n == 0 || m % n == 0) {
return a;
}
m = m % n; // 计算实际需要移动的距离
// 三次反转法
reverse(a, 0, n - 1); // 反转整个数组
reverse(a, 0, m - 1); // 反转前m个元素
reverse(a, m, n - 1); // 反转剩余元素
return a;
}
private:
// 辅助函数:反转数组中从start到end的部分
void reverse(vector<int>& arr, int start, int end) {
while (start < end) {
swap(arr[start], arr[end]);
start++;
end--;
}
}
};

京公网安备 11010502036488号