タイトル
【旋转数组】
配列を指定し、kは非負であるk個のステップ、右にアレイを回転させます。
例1:
Input: [1,2,3,4,5,6,7] and k = 3
Output: [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:
Input: [-1,-100,3,99] and k = 2
Output: [3,99,-1,-100]
説明:
右に回転する1つのステップ:[99、-1、-100,3]
[-1、-100、3,99]:右に2つのステップ回転させ
注意:
この問題を解決するには、少なくとも3種類の方法があることができますように多くのソリューションとして出てくるようにしてください。
あなたはO(1)余分なスペースをその場でそれを行うだろうか?
思考
配列の長さよりもk個の大きなは、各サイクルnums.length低減後の配列は、それがK K%nums.length有効であるべきです。
「アレイの最前線に移動した後のkビットの配列。」 -さて、今回は問題がに変換されます
:この方法は、配列を逆にすることによって行うことができる
[1,2,3,4,5,6,7]
最初のkビット、前者7-kビットフリップ現場後:
[4,3,2,1] + [ 7,6,5]
このとき、アレイ全体、次いで反転回:
[5,6,7,1,2,3,4]
時間計算:O(n)の
空間の複雑さ:O(1)
コード
class Solution {
public void rotate(int[] nums, int k) {
k = k%nums.length;//k比数组长度大的情况,每nums.length次循环后数组还原,所以有效的k应该是k%nums.length
reverse(nums, nums.length-k, nums.length-1);
reverse(nums, 0, nums.length-k-1);
reverse(nums, 0, nums.length-1);
}
public void reverse(int[] nums, int start, int end){//用来反转数组中指定的一段
for( int temp; start < end ; start++,end--){
temp = nums[end];
nums[end] = nums[start];
nums[start] = temp;
}
}
}
結果を発表
ランタイム:速く回転アレイ用のJavaオンライン提出100.00%より0ミリ秒、。
メモリ使用率:38.2メガバイト、回しアレイ用のJavaオンライン提出未満の30.38パーセント。