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]
.
Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
Related problem: Reverse Words in a String II
想法一:每次将数组中的数后移一格,共需K次,O(KN)time,O(1)space
void rotate(vector<int>& nums, int k) {
int N = nums.size();
if(N==0||k<=0) return;
k = k%N;
while(k--){
int t = nums[N-1];
for(int i = N-1; i > 0; i--){
nums[i] = nums[i-1];
}
nums[0] = t;
}
TLE:,O(1)space,O(KN) time ,想办法简化
想法二:截取需要旋转的序列,插入到原来数组的前面。需要O(k%N)的空间放置截取的序列,需要O(N)的时间遍历数组
void rotate(vector<int>& nums, int k) {
int N = nums.size();
if(N==0||k<=0) return;
k = k%N;
vector<int> t(nums.end()-k,nums.end());
for(int i = N-1; i >= k; i--){
nums[i] = nums[i-k];
}
for(int i =0 ;i<k;i++){
nums[i] = t[i];
}
}
简化的代码:
void rotate(vector<int>& nums, int k) {
int offset = nums.size() - (k % nums.size());
vector<int> t(nums.begin() + offset, nums.end());
nums.resize(offset);
nums.insert(nums.begin(), t.begin(), t.end());
}
想法三:跳着替换,首先从首元素开始,找到其移动k步所在的位置,将此位置上的数替换,并保存此位置上原来的数,接着找该位置上原来的数移动k步所在的位置,重复上述步骤,需要注意的是:当N%K==0时,需要考虑跳出循环。little trick:判断是否回到起点start
void rotate(vector<int>& nums, int k) {
int N = nums.size();
k = k%N;
if(N==0||k<=0) return;
int count = N;
int start=0,i=0;
int valueBehind,valueBefore = nums[i];
while(count--){
i = (i+k)%N;
valueBehind= nums[i];
nums[i] = valueBefore;
valueBefore = valueBehind;
if(i==start){
i = ++start;
valueBefore = nums[i];
}
}
}