面试经典150题——轮转数组

面试经典150题 day6

      • 题目来源
      • 我的题解
        • [方法一 使用额外数组](#方法一 使用额外数组)
        • [方法二 循环替换](#方法二 循环替换)
        • [方法三 数组翻转](#方法三 数组翻转)

题目来源

力扣每日一题;题序:189

我的题解

方法一 使用额外数组

使用一个额外数组暂存最终答案,最后再赋值给nums
时间复杂度 :O(n)
空间复杂度:O(n)

java 复制代码
public void rotate(int[] nums, int k) {
    int n=nums.length;
    int[] res=new int[n];

    if(k==0)
        return;
    for(int i=0;i<n;i++){
        res[(i+k)%n]=nums[i];
    }
    for(int i=0;i<n;i++)
        nums[i]=res[i];
}
方法二 循环替换

该方法涉及数学知识,比较复杂,详细过程见官方题解
时间复杂度:O(n)

空间复杂度:O(1)

java 复制代码
class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        k = k % n;
        int count = gcd(k, n);
        for (int start = 0; start < count; ++start) {
            int current = start;
            int prev = nums[start];
            do {
                int next = (current + k) % n;
                int temp = nums[next];
                nums[next] = prev;
                prev = temp;
                current = next;
            } while (start != current);
        }
    }

    public int gcd(int x, int y) {
        return y > 0 ? gcd(y, x % y) : x;
    }
}
方法三 数组翻转

先翻转整个数组,然后再分别翻转0,k%n-1和n%k,n-1两个子数组
时间复杂度:O(n)

空间复杂度:O(1)

java 复制代码
public void rotate(int[] nums, int k) {
    int n=nums.length;
    //这里数组的长度最大是100000
    int index=k%n;
    if(index==0)
        return;
    reverse(nums,0,n-1);
    reverse(nums,0,index-1);
    reverse(nums,index,n-1);
    
    
}
public void reverse(int[] nums,int start,int end){
    int left=start,right=end;
    while(left<right){
        int t=nums[left];
        nums[left]=nums[right];
        nums[right]=t;
        left++;
        right--;
    }
}
java 复制代码
//不知道为什么这样写比上面的快
public void rotate(int[] nums, int k) {
    int index=k%nums.length;
    trverse(nums,0,nums.length-1);
    trverse(nums,0,index-1);
    trverse(nums,index,nums.length-1);
    
}
public void trverse(int[] nums,int start,int end){
    int left=start,right=end;
    while(left<right){
        swap(nums,left++,right--);
    }
}
public void swap(int[] nums,int i,int j){
    if(i==j)
        return ;
    int temp=nums[i];
    nums[i]=nums[j];
    nums[j]=temp;
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

相关推荐
bro_Java6663 小时前
链表进阶2:双向链表的构建
java·数据结构·链表
DeepAgent3 小时前
AI Agent 面试篇(05):AI 面试——对着摄像头怎么答
面试·agent
DianSan_ERP3 小时前
多平台订单自动下载与回传的技术实现:从消息推送到状态闭环引言
java·linux·服务器·前端·网络·架构·自动化
Joe_Wang53 小时前
【从0到1学习JVM · 13】点进JDK源码只有一个分号?搞懂本地方法栈与JNI机制
java·jvm·学习·本地方法栈
AI 算法大模型备案~当当4 小时前
各地备案数量怎么看:一份属地公告的认读与台账方法
java·数据库·人工智能
智鸟科技GemeOpen开发者智能设备4 小时前
GemeOpen 智能音箱 GSSM0B - 播放控制(Java示例)
java·开发语言·智能音箱
需要8264 小时前
分布式 ID 生成:雪花算法、号段模式与时钟回拨
分布式·算法
垆边人似月.4 小时前
华为机考题:字符串分隔
算法·华为
今天的砖头有点烫手啊4 小时前
Java IO/NIO/AIO 演进:从 BIO 到 Netty 的底层逻辑
java·jvm·nio
CQU_JIAKE4 小时前
9.4【A】
算法