c++ | 力扣 | 旋转数组

博客围绕将数组元素向右移动 k 个位置展开,给出示例输入输出。介绍两种思路,一是模拟右移过程,但会超时;二是借助辅助数组,最初直观分前后段放入会出错,后发现 +k 后取模的巧妙办法,还提及想到循环队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

示例 1:
输入: [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]

思路:
最直观的一个个挪,就是模拟右移过程。总共移动k次,外层循环k次。内层循环是取出最后一个存入temp,然后依次右移,最后把temp放回第一个。直观,不易错,但是会超时。。不过还是贴上来:

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int temp = 0;
        for(int  i = 0 ; i < k ; i++){
            temp = nums[nums.size()-1];
            for(int j = nums.size()-1; j > 0 ; j--){
                nums[j] = nums[j-1];
            }
            nums[0] = temp;
        }
    }
};

然后就是借助辅助数组。怎么把原数组的数挪进去,直观思路:按照k的大小,分为前半段和后半段。分别放入辅助数组后再覆盖原nums。但这样带来的问题是,当k小于总长度的时候,会出错。通过查看网上代码,发现一个巧妙的办法是+k后取模。(想到了循环队列)
具体代码:

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        vector<int> temp;
        temp = nums;
        
        for(int i = 0 ; i < nums.size() ; i++){
            temp[(i + k) % nums.size()] = nums[i];
        }
        for(int i = 0 ; i < nums.size() ; i++){
            nums[i] = temp[i];
        }
        
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值