トピック住所:回転配列。
実空間の複雑さ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));
}