轮转数组

给定一个整数数组 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());

    }
};
posted on 2023-02-13 12:26  huangxk23  阅读(46)  评论(0)    收藏  举报