轮转数组
给定一个整数数组 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) 的 原地 算法解决这个问题吗?
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/rotate-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路1
记录每个数组元素轮转后的位置,按照位置摆放即可。
code
class Solution {
public:
void rotate(vector<int>& nums, int k) {
vector<int> ans(nums.size(),0);
for(int i = 0;i < nums.size();i ++)
{
int next = (i + k) % nums.size();
ans[next] = nums[i];
}
for(int i = 0;i < nums.size();i ++)
{
nums[i] = ans[i];
}
}
};
优化空间:翻转数组
在轮转数目为K的条件下,数组的最后K个元素会被放到数组的最前面,但是顺序是不变的。同理,前面剩余的元素也会顺移到数组的后面,同理顺序也是没有发生变化的。我们可以先做整体的翻转,这样后面K个元素会被放到前面,其余元素会被放到后面,但是顺序发生了变化,只需要分别对两个部分再做翻转即可。对于k > nums.size()的情形,只需要取模即可。
code
class Solution {
public:
void rotate(vector<int>& nums, int k) {
k = k % nums.size();
reverse(nums.begin(),nums.end());
reverse(nums.begin(),nums.begin() + k);
reverse(nums.begin() + k,nums.end());
}
};
标签:轮转,nums,int,数组,100,size
From: https://www.cnblogs.com/huangxk23/p/17115912.html