Leetcode 189. 轮转数组
题目
给定一个整数数组 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]
提示:
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
0 <= k <= 105
进阶:
尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
解题思路
直观思路是使用额外空间,根据k重组数组。还可以不使用额外空间原地解决,首先对整个数组反转,然后反转前面k个,最后反转k到最后一个。
代码实现
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, nums.end());
}
};
当然因为本题主要考察数组操作,尽量不使用reverse库函数。用源码实现reverse函数的功能,代码如下:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
if (n == 1 || k % n == 0) {
return;
}
k %= n;
reverse(nums, 0, n - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, n - 1);
}
void reverse(vector<int>& nums, int start, int end) {
while (start < end) {
swap(nums[start], nums[end]);
start++, end--;
}
}
};
原文地址:https://blog.csdn.net/xiaohukuzai/article/details/139028649
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!