Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].
题目要求讲一个数组循环右移k位。
方法一:严格按照右移定义。可按k和(1/2)n的相对大小设计左移和右移,但是时间复杂度高,超出运行时间限制。
void rotate(int nums[], int n, int k) {
int temp;
k%=n;
for (int step = 0; step < k; step++) {
temp = nums[n-1];
for (int i = n-1; i > 0; --i)
{
nums[i] = nums[i-1];
}
nums[0] = temp;
}
}
方法二:思路也很清晰,无技巧。用时56s。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n=nums.size();
k%=n;
for(int i=0;i<n-k;++i){
nums.push_back(nums[0]);
vector<int>::iterator ite=nums.begin();
nums.erase(ite);
}
}
};
方法三:运用技巧型。进行三次反转,一次对前n-k个,一次对剩下k个,最后整体反转。用时24s
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n=nums.size();
k%=n;
vector<int>::iterator ite=nums.begin();
reverse(ite,ite+n-k);
reverse(ite+n-k,ite+n);
reverse(ite,ite+n);
}
};