代码随想录-240131-轮换数组

题目

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

思路

也就是将元素[i]移动到[i+k]的位置。本质上是将数组[0:k-1]赋值nums[size-k:size-1],[k:size-1]赋值nums[0:size-k-1]

有几种可能的思路

  1. 整个数组倒序,前k个再倒序,后size-k个再倒序。

    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());       
        }
    };
    
  2. 暴力交换。i移动到(i+k)%size,(i+k)%size移动到(i+2k)%size,直到(i+m*k)%size=i。每次循环遍历到的元素数a应该满足a*k=b*size。为取到最小的b,a应该是k,size的最小公倍数/k,因此迭代次数num应该为k,size的最大公约数。

    代码:

    class Solution {
    public:
        int gcd(int a, int b)
        {
            while(b != 0)
            {
                int c = a % b;
                a = b;
                b = c;
            }
            return a;
        }
        void rotate(vector<int>& nums, int k) {
    
            k=k%nums.size();
            int tims=gcd(nums.size(),k);
            for(int i=0;i<tims;i++)
            {
                int l=i;
                int r=(i+k)%nums.size();
                int temp=nums[l];
                while(r!=i)
                {
                    nums[r]=temp+nums[r];
                    temp=nums[r]-temp;
                    nums[r]=nums[r]-temp;
                    l=r;
                    r=(l+k)%nums.size();
                }
                nums[r]=temp;
            }
        }
    };
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值