2021-01-08 189.旋转数组

189.旋转数组

这感觉有点像是群论里面轮换和对换的关系,【具体介绍待做】

思路一:一个个换过去(失败)

在这里插入图片描述
这里失败的原因是:

[-1,-100,3,99]
2
预期结果:
[3,99,-1,-100]
实际结果:
[-1,-100,-1,99]

说明我们的算法只是在-1和3之间反复横跳,原因是(3+2)%4=1,(1+2)&4=3。

class Solution {
    
    
    public void rotate(int[] nums, int k) {
    
    
        int l = nums.length;
        int tmp = nums[0];
        int index = 0;
        for(int i=0;i<l;i++){
    
    
            index = (index+k)%l;
            int s = tmp;
            tmp = nums[index];
            nums[index] = s;
        }
    }
}

思路二:Reverse数组!

在这里插入图片描述

class Solution {
    
    
    public void rotate(int[] nums, int k) {
    
    
        k %= nums.length; //注意这里要考虑k比n大的情况,实际上k=n就是绕一圈。
        reverse(nums,0,nums.length);
        reverse(nums,k,nums.length);
        reverse(nums,0,k);
    }

    // reverse nums[l,r[
    public void reverse(int[] nums,int l,int r){
    
    
        r--;
        while(l<r){
    
    
            int tmp = nums[l];
            nums[l] = nums[r];
            nums[r] = tmp;
            l++;
            r--;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44495738/article/details/112343618