原题
https://leetcode.com/problems/rotate-array/
Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].
分析
比较难的是如果只能用 O(1) 的空间。
解法1
我能想到就是新建一个vector模拟rotate的过程:
还有一点注意的就是,当k比较大时可以对数组长度取摸,作用是等效的。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
vector<int>tmp(nums);
int n=nums.size();
k=k%n;
int i=n-k-1;
int j=-1;
while(true)
{
nums[++j]=tmp[++i%n];
if(j==n-1)
break;
}
/*print vector
ostream_iterator<int> it_out(cout," ");
copy(nums.begin(),nums.end(),it_out);
cout<<endl;
*/
}
};
解法2
不用额外空间怎么解?
参考https://discuss.leetcode.com/topic/9801/summary-of-c-solutions/2
简单来说就三步:
1、逆序前n-k个数
2、逆序后k个数
3、逆序整个数组
比如说,[1,2,3,4,5,6,7],k=3。
第一步:
[4,3,2,1,5,6,7]
第二步:
[4,3,2,1,7,6,5]
第三步:
[5,6,7,1,2,3,4]
利用std::reverse
代码非常简洁:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
k%=n;
reverse(nums.begin(),nums.begin()+n-k);
reverse(nums.begin()+n-k,nums.end());
reverse(nums.begin(),nums.end());
}
};