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.
Hint:
Could you do it in-place with O(1) extra space?
Could you do it in-place with O(1) extra space?
Related problem: Reverse Words in a String II
这道题的意思大概是把数组的后k个数挪到前面,思路很简单,每次挪最后一个数到第一个,然后前面的数依次往后挪一位。但是这样的做法leetcode会给出超时的判断,于是在此基础上改进:从第n-k个数开始往前挪,这样每次只有前面的n-k个数会发生挪动,减少了时间开销。比如n=7,k=3,那么要往前挪的数是5,6,7.如果按照每次最后一个数往前挪的方法,那么7挪到前面时,5和6要跟着往后挪。但是如果一开始挪的是5,那么6和7不需要参与计算。当挪6的时候,挪到5的后面,5也不需要在挪动了。以此类推下去……
class Solution {
public:
void rotate(int nums[], int n, int k) {
k %= n;
int temp;
for (int i = 0; i < k; i++)
{
temp = nums[n-k+i];
for (int j = n-k+i; j > i; j--)
{
nums[j] = nums[j-1];
}
nums[i] = temp;
}
}
};
时间上属于中等水平,主要是2层for循环耗费的时间。