从右侧旋转一个n个元素的数组,旋转k位。例如:
其实这个问题类似于字符串逆置问题中的句子逆置。比如“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大于数组的长度,则需要
主要过程如下:
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%nums.size();
for(i = 0,j = nums.size() - k -1; i < j; i ++,j--)
swap(nums[i],nums[j]);
for(i = nums.size()-k,j = nums.size()-1; i < j; i++,j--)
swap(nums[i],nums[j]);
for(i = 0,j = nums.size()-1; i < j; i++,j--)
swap(nums[i],nums[j]);
}
};
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/jeanphorn/article/details/47054555