该方法的原理:数组中的元素全部向右移动k
位置,尾部k%n
个元素会移到数组头部,其余元素会向后移动k%n
个位置。
该方法步骤:①先将所有元素翻转②翻转[0,k%(n-1)]区间内的元素③翻转[k%n,n-1]区间内的元素。
第一步让尾部元素到头部,第二部让新的头部元素顺序正确,第三步让新的尾部元素顺序正确。
示例如下,n=7,k=3。
操作 | 结果 |
---|---|
nums | [1,2,3,4,5,6,7] |
步骤① | [7,6,5,4,3,2,1] |
步骤② | [5,6,7,4,3,2,1] |
步骤③ | [5,6,7,1,2,3,4] |
该方法可以用于轮换数组中的元素,详见LeetCode面试150——189轮转数组
平均时间复杂度为O(n),平均空间复杂度为O(1)。
C++代码实现
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n=nums.size();
k%=n;
reverse(nums.begin(),nums.end());
reverse(nums.begin(),nums.begin()+k);
reverse(nums.begin()+k%n,nums.end());
}
};
Python代码实现
class Solution:
def rotate(self, nums, k):
n = len(nums)
k %= n
nums.reverse()
nums[:k] = reversed(nums[:k])
nums[k:] = reversed(nums[k:])