(ジャワ)leetcode-189回転アレイ

タイトル

【旋转数组】
配列を指定し、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パーセント。

公開された143元の記事 ウォン称賛45 ビュー70000 +

おすすめ

転載: blog.csdn.net/z714405489/article/details/89525802