配列が与えられたら、配列の要素を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]
説明:
できるだけ多くの解決策を考えてください。この問題を解決するには、少なくとも3つの異なる方法があります。
スペースの複雑さがO(1)のインプレースアルゴリズムを使用する必要があります。
出典:LeetCode
リンク:https ://leetcode-cn.com/problems/rotate-array
著作権はLeetCodeが所有しています。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
アイデア:スペースO(1)O(k%len)を期待していなかったので、最初のk%lenビットの配列を保存し、1回トラバースすると、答えが得られます。公式スペースO(1)を投稿してください。
ps:2回フリップすることは、フリップしないことと同じです。
class Solution {
public void rotate(int[] nums, int k) {
//这个必须要取余一下,不然会报错
k %= nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
}
public void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start += 1;
end -= 1;
}
}
}