代码
class Solution {
public:
void rotate(vector<int>& nums, int k)
{
if(nums.size()>0||k>0)
{
k = k%nums.size();//特殊情况,k>N倍的nums.size()
/*int* temp = new int[k];//动态分配内存,用于存放nums中的后k个元素
for(int i=0;i<k;++i)
temp[i]=nums[nums.size()-k+i];
//nums中剩下的元素向右移k个位置,从后往前移,否则会被覆盖
for (int i = nums.size() - k - 1; i >= 0; --i)
nums[i + k] = nums[i];
//再将temp中的元素填回nums中
for(int i=0;i<k;++i)
nums[i]=temp[i];
delete[] temp;*/
reverse(nums,0,nums.size()-1);//整个数组翻转
//将第k个元素作为界,前后两部分分别翻转
reverse(nums,0,k-1);
reverse(nums,k,nums.size()-1);
}
}
void reverse(vector<int>& nums, int begin, int end)
{
while (begin < end)
{
int temp = nums[end];
nums[end--] = nums[begin];
nums[begin++] = temp;
}
}
};
思路
两种方法
1、注释内使用for循环的方法时间复杂度小,但内存消耗大
2、现运行的使用数组翻转的方法,翻转三次,达到目的,时间复杂度略高