空間的複雑さのアレイを回転させる2つの方法がOである(1)+ Oの空間的な複雑さの1種類(N)

トピック住所:回転配列

実空間の複雑さ1ではない、多くのオンラインではない、単に間違っています

以下の概要

方法1

一般的なプロセス(空間的な複雑さは、彼らは無駄なスペースを確認することを、要件を満たしていないが、間違った判断を施していない)
?????
ます。public void rotate1を(int型[] NUMS、INT K){
IF(= nums.length = 1 || K == 0)のリターン ;

    k = k % nums.length;
    int[] ans = new int[nums.length];
    for (int i = 0, j = k; i < nums.length; i++) {
        ans[j] = nums[i];
        j = (j+1) % nums.length;
    }
    System.out.println("Arrays.toString(ans) = " + Arrays.toString(ans));
    for(int i = 0; i < nums.length; i++){
        nums[i] = ans[i];
    }
}

···

方法2:

3つの反転は、思考のこの方法は非常に古典的な、非常に賢いです。
まず第一には反転し、K-1 0に反転した後、最終的には反転kに、正しい結果を得るため、(余分なスペースをのみ切り替えがかかる)宇宙の複雑さ、

Javaを使用すると、確かに複数のスペースの複雑さを来て、書くためのコースを反転

方法3

これは私が考える方法で、毎回右側の現在位置は、次の上の正しい位置に正しい位置を与えることが、この方法は、ピットを持って、生まれ変わりは必ずしも取得することはできないが、 kはかつてよりもさらに数と長さの意志サイクル以上である場合。
あなたは、CNT ++、完了するまでの時間のCNT ==長さ、毎回交換することです、私は最後に、サイクルで何回か来ませんでしたが、簡単な方法があります。現在位置+1からこの連続サイクル、各サイクルの前に一時変数としてNUMS [0]の最初のサイクル(各サイクルは、numは[0]が自動的に正しい数、二度目になり、オーバーであります生まれ変わりはNUMである[1] ...)

public void rotate(int[] nums, int k) {
        if(nums.length == 1 || k == 0) return;
        k = k % nums.length;
        int cnt = 0, r = 0, j;
        while(cnt < nums.length){
            j = k + r;
            while (true) {
                System.out.println(nums[r] + "  " + nums[j]);
                int t = nums[j];
                nums[j] = nums[r];
                nums[r] = t;
                j = (j + k) % nums.length;
                cnt++;
                if(j == r){
                    cnt++;
                    break;
                }
            }
            System.out.println(Arrays.toString(nums));
            r++;
        }
//        System.out.println( Arrays.toString(nums));
    }

おすすめ

転載: www.cnblogs.com/wmxl/p/11260998.html