Leetcode 189 旋转数组

题目要求:


思路:

  第一眼看到这个题,想到的思路和约瑟夫环类似,就是一个数组的整数取余问题。但是在实际的测试运行中发现,自己有几个方面还是疏忽了。如果没有要求空间复杂度为O(1)的话,这个和约瑟夫环的解题思路几乎没什么区别。但就是这个要求,让自己犯了几个错误,做题的时候一定要学会变通。


设数组的长度为length,向右移动k(默认k<length)个位置

思路一

从第一个元素开始,向右移动k个位置,那么第一个元素的最终位置就是(0+k)%length;

同理第(0+k)%length个元素,向右移动k个位置,那么第(0+k)%length个元素的最终位置就是((0+k)%length+k)%length

......

这个解题思路对于示例一的输入是完全可以解出的,同理,对于length为奇数的数组是完全可以解出的。

思路一对于示例二的输入时,就显得无能为力了,因为它会陷入到一个循环中,就是这么一个循环困扰了我很久。

思路二

跳出这个循环很简单,一个方法是从第一个元素循环到第k个元素,这样就可以保证所有的元素都已经到最终位置上了,在其再进行优化的话就是添加一个计数swapCount,当swapCount等于length时跳出循环,这样可以避免重复遍历。


代码

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int swapCount = 1,length = nums.size();
        int lastValue,nextValue;
        k %= length;
        for(int i=0;i<k;i++){
            if(swapCount>length) break;
            int index = i;
            lastValue = nums[i];
            while((index+k)%length != i)
            {
                nextValue = nums[(index+k)%length];
                nums[(index+k)%length] = lastValue;
                index = (index+k)%length;
                swapCount++;
                lastValue = nextValue;
            }
            nums[i] = lastValue;
            swapCount++;
        }
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值