这个旋转数组,看似挺简单,但真正想要不用调试,直接写出通过的,基本功还是要特别扎实,记自己通过的三种方法
class Solution {
public:
/* solution 1:直接用了n个辅助空间,空间复杂度过高 */
void rotate(vector<int>& nums, int k) {
vector<int> ret;
ret.resize(nums.size());
int len = nums.size();
for (int i = 0; i < nums.size(); ++i) {
ret[(i + k) % len] = nums[i];
}
nums = ret;
}
/* solution 2 这个比较精巧一些,花了些时间思考,特别是if (cur == start)那个逻辑*/
void rotate(vector<int>& nums, int k) {
int len = nums.size();
int last = nums[0];
int cur = 0;
int start = 0;
for (int i = 0; i < nums.size(); ++i) {
int next = nums[(cur + k) % len];
nums[(cur + k) % len] = last;
last = next;
cur = (cur + k) % len;
//这个逻辑特别重要,自己第一遍的时候没想到,就是有可能往后跳回当前的,例如输入是{1,2,3,4},k=2的时候,会一直在1和3之间来回跳,则需要通过这个逻辑来往前移动操作
if (cur == start) {
cur++;
start++;
last = nums[cur];
}
}
}
/* solution 3 */
void reverse(vector<int>& nums, int start, int end) {
while (start < end) {
int tmp = nums[end];
nums[end] = nums[start];
nums[start] = tmp;
++start;
--end;
}
}
void rotate(vector<int>& nums, int k) {
if (k == 0 || (0 == k % nums.size())) {
return;
}
//特别重要,不要做无用功
k = k % nums.size();
reverse(nums, 0, nums.size() - k - 1);
reverse(nums, nums.size() - k, nums.size() - 1);
reverse(nums, 0, nums.size() - 1);
}
};