旋转数组

传送门:旋转数组


又是面向评论区编程的一天,打开评论,选中热门,Ctrl+C,V,看着上面时间超过100%,我觉得自己又行了!!!

最先想到的就是线性移动,循环k次,每次取出数组中最后一个数,然后所有数字后移一个位置

但是这种方法太慢了,那么有没有更简单一点的方法呢!

旋转数组_第1张图片


显然是有的!

这个时候打开评论区,选中我们需要的代码

旋转数组_第2张图片

提交,又是水题的一天!!!

我们想到,当移动k次后,尾部的k mod n个元素就会被移动到数组的头部,其余元素往后移动k mod n个位置

该方法为数组的翻转:我们可以先将所有元素翻转,这样尾部的 k mod n 个元素就被移至数组头部,然后我们再翻转[0,k mod n -1]区间的元素和 [k mod n,n-1]区间的元素即能得到最后的答案。

Code:

class Solution {
     
    public void rotate(int[] nums, int k) {
     
        for (int i = 0; i < k; i++) {
     
            int temp = nums[nums.length - 1];
            for (int i1 = nums.length - 1; i1 >= 1; i1--) {
     
                nums[i1] = nums[i1-1];
            }
            nums[0] = temp;
        }
    }
}

Code:

class Solution {
     
    public void rotate(int[] nums, int k) {
     
        int n=nums.length;
        k=k%n;
        reverse(nums,0,n-1);
        reverse(nums,k,n-1);
        reverse(nums,0,k-1);
    }
    private static void reverse(int[] nums,int start,int end){
     
        while(start<end){
     
            int temp=nums[start];
            nums[start]=nums[end];
            nums[end]=temp;
            start++;
            end--;
        }
    }
}

你可能感兴趣的:(算法,算法,数据结构,leetcode)