189.轮转数组

128 阅读1分钟

189. 轮转数组 - 力扣(LeetCode)

方法一,空间复杂度为O(n).

class Solution {
    public void rotate(int[] nums, int k) {
         //想不出来空间复制度为O(1)的方法,只能用最笨的方法,复制一个相同的数组
         int[] tmp = new int[nums.length];
         for(int i = 0; i < nums.length; i++) {
            tmp[i] = nums[i];
         }
         for(int i = 0; i < nums.length; i++) {
            int idx = (i+k)%nums.length;
            nums[idx] = tmp[i];
         }

    }
}

方法二:空间复杂度为O(1),最优方法 可以观察到该题可以该题其实操作后两组元素的顺序还是保存不变的,然后通过翻转等性质可以得到答案 图解(引用自leetcode上大佬的题解)

image.png

image.png

第一步 image.png

第二步 image.png 第三步

image.png

最后一步

image.png

代码如下:

class Solution {
    public void rotate(int[] nums, int k) {
        k%=nums.length;
        reverse(nums,0,nums.length-1);
        reverse(nums,0,k-1);
        reverse(nums,k,nums.length-1);
        

    }
    public void reverse(int[] nums,int i,int j) {
        while(i < j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
            i++;
            j--;
        }
    }
}