题目
https://leetcode.cn/problems/rotate-array/description/https://leetcode.cn/problems/rotate-array/description/
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3 输出:[5,6,7,1,2,3,4]
解释: 向右轮转 1 步:[7,1,2,3,4,5,6]
向右轮转 2 步:[6,7,1,2,3,4,5]
向右轮转 3 步:[5,6,7,1,2,3,4]
示例 2:
输入:nums = [-1,-100,3,99], k = 2 输出:[3,99,-1,-100] 解释: 向右轮转 1 步: [99,-1,-100,3] 向右轮转 2 步: [3,99,-1,-100]
分析
假设下面是一个数组:
假设k=2,如下图,也就是将粉色部分与蓝色部分互换位置
分析如下:
第一步 将整个数组逆置
第二步 将蓝色部分,也就是前k个元素逆置
第三步 将红色部分,也就是数组中剩余的元素逆置
最后得到想要的结果
代码
class Solution {
public:
void rotate(vector<int>& nums, int k) {
//如果k的大小超过数组长度是没有意义的,应该让k模上数组大小
k%=nums.size();
//然后对整个数组进行翻转
reverse(nums.begin(),nums.end());
//接着翻转前k个数字
reverse(nums.begin(),nums.begin()+k);
//最后翻转剩余的数字
reverse(nums.begin()+k,nums.end());
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)