🍪🧁🍧

leetcode189.轮转数组

为什么题解那么简洁,我都写不出来☹️,我连正确的解法都写不出来🥹
1.开辟额外数组空间

var rotate = function(nums, k) {
    const n = nums.length;
    const newArr = new Array(n);
    for (let i = 0; i < n; ++i) {
        newArr[(i + k) % n] = nums[i];
    }
    for (let i = 0; i < n; ++i) {
        nums[i] = newArr[i];
    }
};

2.第二种做法每次小循环其实是
ans=(start+k)%n ans=(ans+k)%n其中不可能有重复的值且最后一定会回到起始位置
每次回到原始位置时,原始位置的下一个值一定没有被遍历过
一共有多少个循环?gcd(n,k)个 每个循环的起点就是0,1,...,gcd(n,k)-1

//进行了n次交换
var rotate = function(nums,k){
    const n=nums.length
    for(let start=0,cnt=0;cnt<n;start++){
        let cur=start
        let tmp=nums[cur]
        do{
            nxt=nums[(cur+k)%n]
            nums[(cur+k)%n]=tmp
            tmp=nxt 
            cur=(cur+k)%n
            cnt++
        }while(cur!=start)
    }
    return nums
}
//gcd(n,k)求循环次数
const gcd = (x, y) => y ? gcd(y, x % y) : x;
var rotate = function(nums,k){
    let n=nums.length
    let count=gcd(k,n)
    for(let start=0;start<count;start++){
        let cur=start
        let tmp=nums[start]
        do{
            let nxt=nums[(cur+k)%n]
            nums[(cur+k)%n]=tmp
            cur=(cur+k)%n
            tmp=nxt
        }while(cur!=start)
    }
    return nums
    
}

3.三次reverse

let reverse=function(nums,l,r){
    while(l<r){
        [nums[l],nums[r]]=[nums[r],nums[l]]//创建新数组[nums[r],nums[l]]然后再分别赋值给nums[l],nums[r]
        // let tmp=nums[l]
        // nums[l]=nums[r]
        // nums[r]=tmp
        l++
        r--
    }
}
var rotate=function(nums,k){
    let n=nums.length
    k=k%n
    reverse(nums,0,n-1)
    reverse(nums,0,k-1)
    reverse(nums,k,n-1)
}
posted @ 2025-03-16 02:38  不想吃fun  阅读(19)  评论(0)    收藏  举报