以[1,2,3,4,5,6,7]和k=3为例,处理之后的答案为[5,6,7,1,2,3,4],对该答案反转可以得到[4,3,2,1,7,6,5]。观察可知,相当于把原先的元素根据K值大小分为二段,分别反转,之后再把整个数组反转即可。
且元素的移动是有周期的,周期即为数组的长度。针对k值大于数组元素个数的情况,可以先进行一个模运算。
class Solution {
public:
void rotate(vector<int>& nums, int k)
{
k=k%nums.size();
reverse(nums,0,(nums.size()-k-1));
reverse(nums,nums.size()-k,nums.size()-1);
reverse(nums,0,nums.size()-1);
}
void reverse(vector<int>& nums,int begin,int end)
{
while(begin<end)
{
int temp=nums[begin];
nums[begin]=nums[end];
nums[end]=temp;
begin++;
end--;
}
}
};