题解 | 旋转数组 reverse的妙用。妙之
旋转数组
https://www.nowcoder.com/practice/e19927a8fd5d477794dac67096862042
#include <algorithm>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 旋转数组
* @param n int整型 数组长度
* @param m int整型 右移距离
* @param a int整型vector 给定数组
* @return int整型vector
*/
vector<int> solve(int n, int m, vector<int>& a) {
// write code here
//一开始没思路 画个图就发现了
//直觉告诉我们这应该是个环 在整体平移 但如果平移的话 时间复杂度就是 n*m
//下标为i 变换后下标i+m%n,从0开始,找它应该去的地方 它占据的地方去它变换后的地方 直到最后回到下标0.
//但好像还有一种情况 这个n是m两倍时 相当于两个元素交换
//n是m3倍时 三个元素为周期回到原点
// **********************************************
//上面有道理但不是左右解哈
//从结果出发 移动m个元素 0123456 变成4560123,这可以通过翻转得到 6543210 再分别翻转。
m=m%n;
if(n==1)return a;
reverse(a.begin(), a.end());
//int pivot=m;//是一开始的下标0出现的下标。
reverse(a.begin(),a.begin()+m);
/*std::reverse 函数遵循的是 左闭右开 原则。
这意味着它反转的区间是 [first, last)
end() 迭代器的设计非常巧妙,它指向的是最后一个元素的“下一个位置*/
reverse(a.begin()+m,a.end());
return a;
}
};
查看14道真题和解析
