【Leetcode】189. Rotate Array
题目链接:https://leetcode.com/problems/rotate-array/description/
@(Leetcode)
思想:首先最容易想到的方法是开辟临时空间,把元素移过去,需要注意的是把前面部分往后面移动的时候再从后面往前移动,以免覆盖前面的覆盖后面的元素。
我的AC代码:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int size= nums.size();
int ki= k% size;
if (ki== 0) return;
int temp;
for (int i= 0; i< ki; i++) {
temp.push_back(nums[size- ki+ i]);
}
for (int i= size- ki- 1; i>= 0; i--) {
nums[ki+ i]= nums[i];
}
for (int i= 0; i< ki; i++) {
nums[i]= temp[i];
}
return;
}
};
然后发现题目说有更好的方法,看了网上其他人的解答后,可以先把前半部分逆过来,然后再把后面的部分逆过来, 最后把整个数组逆过来,这种巧妙的方法,我实现的代码如下:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int size= nums.size();
int ki= k% size;
if (ki== 0) return;
vector<int>::iterator iter0= nums.begin();
vector<int>::iterator iter1= nums.begin();
vector<int>::iterator iter2= nums.end();
for (int i= 0; i< size- ki; i++) {
iter1++;
}
reverse(iter0, iter1);
reverse(iter1, iter2);
reverse(iter0, iter2);
}
};
代码中,把数组倒转用到的是algorithm里面的reverse函数。注意倒转的范围是[pointer1, pointer2)。