【leetcode】189. 旋转数组(rotate-array)(模拟)[中等]

215 篇文章 0 订阅
66 篇文章 0 订阅
这篇博客详细介绍了如何解决LeetCode上的旋转数组问题,提供了两种不同的解决方案,分别是遍历移动法和循环节移动法,时间复杂度均为O(n)。作者分别给出了两种方法的实现代码,并解释了思路,有助于读者理解和掌握该问题的解法。
摘要由CSDN通过智能技术生成

链接

https://leetcode-cn.com/problems/rotate-array/

耗时

解题:23 +10 min
题解:10 + 8 min

题意

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

思路

id思路时间空间代码
1遍历一趟,记录每个位置是否移动过,如果没有则将当前元素往后移k位,后k位元素再往后移k位,如此继续,直到再次想移动当前元素为止;如果移动过则尝试下一个元素。 O ( n ) O(n) O(n) O ( n ) O(n) O(n)code1
2将循环节里的元素顺次移动,并记录每个循环节的长度;每次向后顺序遍历新的元素开始新的循环节,直到循环节的长度和等于数组的长度 O ( n ) O(n) O(n) O ( 1 ) O(1) O(1)code2

AC代码

code1

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        k = k%n;
        vector<bool> vis(n, false);
        for(int i = 0; i < n; ++i) {
            if(vis[i]) continue;
            vis[i] = true;
            int firstnum = nums[i];
            int pos = (i+k)%n;
            while(pos != i) {
                vis[pos] = true;
                swap(nums[i], nums[pos]);
                pos = (pos+k)%n;
            }
        }
    }
};

back to 思路

code2

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        k = k%n;
        if(k == 0) return ;
        int cirsum = 0;
        for(int i = 0; cirsum < n; ++i) { 
            int pos = (i+k)%n;
            int circnt = 1;
            while(pos != i) {
                swap(nums[i], nums[pos]);
                pos = (pos+k)%n;
                circnt++;
            }
            cirsum += circnt;
        }
    }
};

back to 思路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值