具体思想:
1.数组反转问题:
可以观察到,一次整体反转,两次局部反转,可以破解这个问题;
2.一步到位:
自己意识到可以这么做,但是没想到最大公约数问题;
具体代码:
数组反转:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
if(k%nums.size()==0)
return;
k=k%nums.size();
reverse(nums.begin(),nums.end());
reverse(nums.begin(),nums.begin()+k);
reverse(nums.begin()+k,nums.end());
return;
}
};
一步到位:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int len=nums.size();
k%=len;
int c=gcd(k,len);
for(int i=0;i<c;i++){
int temp=nums[i];
int cur=(i+k)%len;
while(cur!=i){
int p=nums[cur];
nums[cur]=temp;
temp=p;
cur=(cur+k)%len;
}
nums[i]=temp;
}
}
};