leetcode-189-回転配列(Rotate Array)-java
3722 ワード
テーマ及びテスト用例
方法1(33例成功,1タイムアウト,速度不足)はo(kn)である.
方法2(成功,2 ms,極速)kの大きさの配列を用いて0−k−1ビットの数字を保存し,その後index=(i+k)mod lengthに従ってkからlength−1ビットの数字を新しい位置に配置し,temp配列を新しい位置に入れる
方法3、他の人の(とても良くて、1つのtempしか使いません)反転用の空間は1つの変数だけでいいから(あるいは使わなくてもいいので、ビット演算を使えばいいです)配列を2つの部分に分けて、0--length-k-とlength-k-length-1に分けます;2つの部分はそれぞれ反転して、更に全体的に反転して、正しい結果を得ることができます.例:[1,2,3,4,5,6,7]とk=3は[1,2,3,4]と[5,6,7]に分けられます;それぞれ反転して得られる[4,3,2,1,7,6,5]再全体反転[5,6,7,1,2,3,4]すなわち、正確な結果として各数が本来あるべき位置は(i+k)mod length 0である--length-k-1はlength-k-i再反転k+i length-k--length-1はlength*2-k-iであり、再反転k+i-lengthの2つは(i+k)mod lengthである
package pid189;
/*
, k , k 。
1:
: [1,2,3,4,5,6,7] k = 3
: [5,6,7,1,2,3,4]
:
1 : [7,1,2,3,4,5,6]
2 : [6,7,1,2,3,4,5]
3 : [5,6,7,1,2,3,4]
2:
: [-1,-100,3,99] k = 2
: [3,99,-1,-100]
:
1 : [99,-1,-100,3]
2 : [3,99,-1,-100]
:
, 。
O(1) 。*/
public class main
{
public static void main(String[] args) {
int[][] testTable = {{1,2,3,4,5,6,7},{-1,-100,3,99},{-1,-100,3,99},{4,6,2,0,-99}};
int[] testTable2={3,2,3,6};
/*for (int[] ito : testTable) {
test(ito);
}*/
for(int i=0;i<4;i++){
test(testTable[i],testTable2[i]);
}
}
private static void test(int[] ito,int ito2) {
Solution solution = new Solution();
int rtn;
long begin = System.currentTimeMillis();
for (int i = 0; i < ito.length; i++) {
System.out.print(ito[i]+" ");
}
System.out.println(ito2);
System.out.println();
//
//rtn =
solution.rotate(ito,ito2);//
long end = System.currentTimeMillis();
//System.out.println(ito + ": rtn=" + rtn);
//System.out.println(ito + ": rtn=" +rtn);
for (int i = 0; i < ito.length; i++) {
System.out.print(ito[i]+" ");
}//
System.out.println();
System.out.println(" :" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
方法1(33例成功,1タイムアウト,速度不足)はo(kn)である.
package pid189;
public class Solution
{
// 1 k
public void rotate(int[] nums, int k) {
int length=nums.length;
int tempPrev;
int tempNext;
k=k%length;
if (k==0&&length==0&&length==1)
{
return;
}
for(int i=0;i
方法2(成功,2 ms,極速)kの大きさの配列を用いて0−k−1ビットの数字を保存し,その後index=(i+k)mod lengthに従ってkからlength−1ビットの数字を新しい位置に配置し,temp配列を新しい位置に入れる
package pid189;
class Solution {
public void rotate(int[] nums, int k) {
int length=nums.length;
if(length==0){
return;
}
k=k%length;
if(k==0){
return;
}
int[] temp=new int[k];
for(int i=0;i=k;i--){
int index=(i+k)%length;
nums[index]=nums[i];
}
for(int i=0;i
方法3、他の人の(とても良くて、1つのtempしか使いません)反転用の空間は1つの変数だけでいいから(あるいは使わなくてもいいので、ビット演算を使えばいいです)配列を2つの部分に分けて、0--length-k-とlength-k-length-1に分けます;2つの部分はそれぞれ反転して、更に全体的に反転して、正しい結果を得ることができます.例:[1,2,3,4,5,6,7]とk=3は[1,2,3,4]と[5,6,7]に分けられます;それぞれ反転して得られる[4,3,2,1,7,6,5]再全体反転[5,6,7,1,2,3,4]すなわち、正確な結果として各数が本来あるべき位置は(i+k)mod length 0である--length-k-1はlength-k-i再反転k+i length-k--length-1はlength*2-k-iであり、再反転k+i-lengthの2つは(i+k)mod lengthである
: 。
public class Solution {
private void reverse(int[] nums, int from, int to) {
while (from < to) {
nums[from] ^= nums[to];
nums[to] ^= nums[from];
nums[from] ^= nums[to];
from ++;
to --;
}
}
public void rotate(int[] nums, int k) {
k = k % nums.length;
reverse(nums, 0, nums.length-k-1);
reverse(nums, nums.length-k, nums.length-1);
reverse(nums, 0, nums.length-1);
}