LeetCode Day5 旋转数组+二维数组遍历

189 旋转数组

题目理解

给定k和数组nums,数组元素循环右移k。

思路

①扩展数组,将长度n->2n,则右移后的数组元素为n+k,需要注意的是k可能大于n,考虑元素右移n后,位置并不会发生变化,因此实际右移后的位置为k%n。这样,右移结束后,只需把下标为n及以后的元素移到数组前即可。
② ①的方法增加了额外的空间,为减少空间复杂度,考虑直接在原数组中进行右移。假设当前为i位置,右移后的位置为i+k,显然直接将nums[i]的值赋给nums[i+k],会影响nums[i+k]的右移,因此需要考虑把当前右移的数存在一个temp中,将右移后的位置的值与temp进行交换,继续右移,如图所示。怎样判断是否结束呢,当右移后的位置为起始右移位置后,再右移就成了死循环,显然为结束条件。怎样判断所有元素都右移结束,我采用的方法是用一个count统计数值交换的次数,count=n,则所有元素都已右移。
在这里插入图片描述
③题解中还有一种思路是将数组右移k后,数组中尾部k个元素会移动到数组头部,因此可以先将数组全部翻转,然后再分为两部分,分别将原先尾部的k个元素和原先头部的n-k个元素翻转。

代码

class Solution {
   
public:
    void rotate(vector<int>& nums, int k) {
   
        int n=nums.size();
        if(k>=n)
            k=k%n;
        for(int i=n-1;i>=0;i--) //要倒着来,否则数组元素可能会改变。
        {
   
            nums.resize(2*n);
            nums[i+k]=nums[i];
        }
        for(int i=0;i<k;i++)
        {
   
            nums[i]=nums[n+i];
        }
        nums.resize(n);
    }
};

class Solution {
   
public:
    void rotate(vector<int>& nums, int k) {
   
        int n=nums.size();
        int count=0;
        k=k%n;
        for(int i=0;count!=n;i++)
        {
   
            int cur=i;
            int temp=nums[cur];
            do{
   
                int next=(cur+k)%n;
                swap(nums[next],temp);
                cur=next;
                count++;
            }while(cur!=i);
        }
        
    }
};

class Solution {
   
public:
    void rotate(vector<int>& nums, 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值