力扣hot100:15.轮转数组

 题目描述

力扣hot100:15.轮转数组_第1张图片

第一次:纯暴力

复杂度太高:O(N^2),未通过测试

class Solution {
    public void rotate(int[] arr, int k) {
        for (int i = 0; i < k; i++) {
            // 将数组右移一位
            int flag = arr[arr.length - 1];
            for(int j=arr.length-1;j>0;j--){
                arr[j]=arr[j-1];
            }
            arr[0]=flag;
        }
    }
}

第二次:反转三次

复杂度降低:O(N),通过测试

class Solution {
    public void rotate(int[] arr, int k) {
        if (arr.length==0||arr.length==1||k<=0)
            return;
        //有效轮转次数
        k=k%arr.length;
        //反转整个数组
        fanzahun(arr,0,arr.length-1);
        //反转前k个元素
        fanzahun(arr,0,k-1);
        //反转后n-k个元素
        fanzahun(arr,k,arr.length-1);
    }
    public void fanzahun(int[] arr,int start,int end){
        while(start

第三次:使用额外的数组(官方题解)

复杂度:O(N),通过测试

class Solution {
    public void rotate(int[] arr, int k) {
        int n = arr.length;
        int[] newArr = new int[n];
        for (int i = 0; i < n; ++i) {
            newArr[(i + k) % n] = arr[i];
        }
        System.arraycopy(newArr, 0, arr, 0, n);
    }
}

题目链接:189. 轮转数组 - 力扣(LeetCode)

你可能感兴趣的:(力扣hot100,leetcode,算法,java,日常记录)