189.轮转数组

一个简单的题目但是想要做出空间复杂度O(1)的做法还是有难度的

先说说简单的做法 

1.让nums每次整体右移一位,移动k次 时间O(nk) 空间O(1)  

2.使用一个标记数组 每次移动k位      时间O(n)   空间O(n)

再来看看优秀的做法

方法一: 环状替换法

        我们直接把一个元素替换到它最终要去的地方(i+k)%n ,但是这样可能会导致那个地方的数值被覆盖,所以我们使用tmp 和nextTmp记录这两个地方的数值,在更新中迭代

     int tmp=nums[curIndex],nextTmp=nums[(curIndex + k)%len];
            while(true){
                nums[(curIndex + k)%len] = tmp;
                tmp = nextTmp;
                curIndex = (curIndex + k) % len;
                if(curIndex == curTime) break;
                nextTmp = nums[(curIndex + k)%len];
            }

        但是这样的循环要走几次呢, 我们假设从起点出发,一步跨过k个元素,最后回到起点走了a圈,那么an=kb,这里的b是走一趟会遇到的元素,  注意这个等式就说明an是n和k的公倍数了,因为它除以n或者k得到的结果都是整数.  又因为我们是第一次回到起点,这说明a是最小的, 所以an是n和k的最小公倍数 lcm(n,k) 所以b=lcm(n,k)/k  那么一共要走 n/b =nk/lcm(n,k) = gcd(n,k) 因为最小公倍数和最大公约数的乘积就是他们本身

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int len = nums.size();
        int times = 1;
        if(k==0) return;
        times = gcd(len,k);
        for(int curTime = 0;curTime<times;curTime++){
            int curIndex = curTime;
            int tmp=nums[curIndex],nextTmp=nums[(curIndex + k)%len];
            while(true){
                nums[(curIndex + k)%len] = tmp;
                tmp = nextTmp;
                curIndex = (curIndex + k) % len;
                if(curIndex == curTime) break;
                nextTmp = nums[(curIndex + k)%len];
            }
        }
    }
};

        

方法二: 数组反转法

        不妨取 k%=nums.size(),因为每走一个nums.size() 数组其实又回到了起点

        之后(0<=k<nums.size())我们来看 题目要求的结果中  数组最后的k个元素会被移动到数组最前面,而我们知道 一个序列反转两次就会变成原来的顺序

        所以我们可以先反转一次使得最后的k个元素到首部 ,之后对 [0,k mod n−1] 区间的元素和 [k mod n,n−1] 分别再反转一次就得到答案.

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k%=nums.size();
        reverse(nums.begin(),nums.end());
        reverse(nums.begin(),nums.begin()+k);
        reverse(nums.begin()+k,nums.end());
    }
};

相关推荐

  1. Leetcode 189. 轮转数组

    2024-03-10 12:40:02       23 阅读
  2. 【Leetcode-189.轮转数组

    2024-03-10 12:40:02       19 阅读
  3. [leetcode] 189. 轮转数组

    2024-03-10 12:40:02       19 阅读
  4. Leetcode 189. 轮转数组

    2024-03-10 12:40:02       13 阅读
  5. leetcode-189 轮转数组

    2024-03-10 12:40:02       9 阅读
  6. LeetCode 189.轮转数组

    2024-03-10 12:40:02       7 阅读
  7. 【力扣】189.轮转数组

    2024-03-10 12:40:02       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 12:40:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 12:40:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 12:40:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 12:40:02       18 阅读

热门阅读

  1. AI 改变生活

    2024-03-10 12:40:02       18 阅读
  2. jenkins 迁移(centos7服务器之间)

    2024-03-10 12:40:02       23 阅读
  3. Python2.x 与 3.x 版本区别

    2024-03-10 12:40:02       22 阅读
  4. 设计一个在线点评系统100问?

    2024-03-10 12:40:02       22 阅读
  5. 转载)word输出高分辨PDF并且有链接跳转功能

    2024-03-10 12:40:02       27 阅读
  6. python中的排序(一)

    2024-03-10 12:40:02       22 阅读