class Solution {
public:
void rotate(vector<int>& nums, int k) {
if(k%nums.size()==0||nums.empty()) return;
k = k%nums.size();
vector<int> nums_new(nums);
for(int i=nums.size()-k,j=0;i<nums.size();i++,j++)
{
nums[j]=nums[i];
}
for(int i=k,j=0;i<nums.size();i++,j++){
nums[i]=nums_new[j];
}
return;
}
};
我能想到的解决方案,声明一个新的数组,然后先把后面的k个移到前面来,然后再把新书组中前面的n-k个复制到原始数组的后n-k个位置。另外边界条件,如果k是数组长度的整数倍,那么直接返回就好,另外k对数组长度取余,可以减少时间复杂度,因为其实移动数组长度的整数倍,等于原数组没有变化。
移动k次:超时了。。。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
if(k%nums.size()==0||nums.empty()) return;
k = k%nums.size();
for(int i=1;i<=k;i++){//一共移动k次,每一次,最后一个元素放到第一个位置,其余依次往后一个
int pre = nums[nums.size()-1];//保存最后一个元素
for(int j=0;j<nums.size();j++){//把当前元素替换为pre,并且更新pre为当前元素
int tmp = nums[j];
nums[j] = pre;
pre = tmp;
}
}
return;
}
};
反转三次,1234567,反转后,7654321,然后前k个再反转,5674321,然后后n-k个再反转,5671234,ok!
class Solution {
public:
void rotate(vector<int>& nums, int k) {
if(k%nums.size()==0||nums.empty()) return;
k = k%nums.size();
reverse(nums,0,nums.size()-1);
reverse(nums,0,k-1);
reverse(nums,k,nums.size()-1);
return;
}
void reverse(vector<int>& nums, int begin,int end){
while(begin<end){
int tmp = nums[begin];
nums[begin] = nums[end];
nums[end] = tmp;
begin++;
end--;
}
return;
}
};