leetcode:189. 轮转数组
题目
给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
示例:
输入: 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]
输入:nums = [-1,-100,3,99], k = 2输出:[3,99,-1,-100]解释:向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100]
解答 & 代码
三次翻转:设数组 nums 向右轮转 k 个位置(注:k 要先对数组长度 len 取余)
- 翻转前
len - k个数nums[0, ..., len-k-1] - 翻转后
k个数nums[len-k, ..., len-1] - 翻转整个数组
例:nums = [1,2,3,4,5,6,7], k = 3
- 翻转前
len - k个数:nums = [**4,3,2,1**,5,6,7] - 翻转后
k个数:nums = [4,3,2,1,**7,6,5**] - 翻转整个数组:
nums = [**5,6,7,1,2,3,4**]
class Solution {public:void rotate(vector<int>& nums, int k) {int len = nums.size();if(k >= len) // 注意:如果 k >= len,则先取余k = k % len;// 三次翻转reverse(nums.begin(), nums.begin() + len - k); // 翻转前 len - k 个数reverse(nums.begin() + len - k, nums.end()); // 翻转后 k 个数reverse(nums.begin(), nums.end()); // 反转整个数组}};
复杂度分析:设数组长为 N
- 时间复杂度 O(N):
- 空间复杂度 O(1)
执行结果:
执行结果:通过执行用时:12 ms, 在所有 C++ 提交中击败了 99.85% 的用户内存消耗:24.4 MB, 在所有 C++ 提交中击败了 62.29% 的用户
