1. 问题描述
从右侧旋转一个n个元素的数组,旋转k位。例如: n=7,k=3 , arr=[1,2,3,4,5,6,7] 旋转成为 arr=[5,6,7,1,2,3,4] 。
2. 方法与思路
其实这个问题类似于字符串逆置问题中的句子逆置。比如“hello world”逆置成”world hello”。解决这种问题的O(1)空间复杂的算法通常是先逆置单词,后逆置整个句子。
针对这个问题,思路一样。第一次逆置前半段[4,3,2,1,5,6,7],第二次逆置后半段[4,3,2,1,7,6,5],最后整个逆置[5,6,7,1,2,3,4]。
注意:如果k大于数组的长度,则需要 k=k%arr.len ,因为数组在旋转一圈后还是等于原来的数组。
主要过程如下:
I. for i:0→arr.size−k−1
逆置
II. for i:(arr.size−k)→arr.size−1
逆置
III. for i:0→arr.size−1
逆置
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int i,j;
k = k%();
for(i = 0,j = () - k -1; i < j; i ++,j--)
swap(nums[i],nums[j]);
for(i = ()-k,j = ()-1; i < j; i++,j--)
swap(nums[i],nums[j]);
for(i = 0,j = ()-1; i < j; i++,j--)
swap(nums[i],nums[j]);
}
};