Leetcode Leetcode 189.配列pythonを回転させる3つの方法(人気のない方法を含む)

トピック:

配列が与えられたら、配列の要素をkの位置から右に移動します。ここで、kは非負の数です。
上級:
できるだけ多くの解決策を考えてください。この問題を解決するには、少なくとも3つの異なる方法があります。
スペースの複雑さがO(1)のインプレースアルゴリズムを使用して、この問題を解決できますか?

Example_1:

入力:nums = [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]

Example_2:

入力:nums = [-1、-100,3,99]、k = 2
出力:[3,99、-1、-100]
説明:
1ステップ右に回転:[99、-1、-100 、3]
右に2ステップ回転します:[3,99、-1、-100]

Solution_1:

回転関数を
直接使用しない理由がわかりません回転関数を直接使用して配列を回転できます
同時に、この質問の結果のため、数値を変更して、
最後にそれぞれを置き換える必要があります。回転後の関数でnumsのビット。
同時に、この方法の効率は悪くありません。
可能であれば、回転関数は比較的人気がありません
回転関数は非常に効率的である
ため、考慮する必要はありません。 kがnumsより長い場合。

Code_1:

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        a = collections.deque(nums)
        a.rotate(k)
        a = list(a)
        for i in range(len(nums)):
            nums[i] = a[i]

Answer_1:

効率は実際には非常に高いです

Solution_2:


k
が0ビットの数の最後の要素である可能性があり、最後の要素の
削除が
k回繰り返される場合よりも長いnumsを避けるために、変位したnumskを前に戻すのと同じです。
長さよりも大きいkに注意してください。
必要に応じてアレイの残りのkを取り、
動作効率高めます

Code_2:

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
		k %= len(nums)
        for i in range(k):
            nums.insert(0, nums[-1])
            nums.pop()

Answer_2:
非常に低い効率

Solution_3:

3番目の方法は素晴らしいです
私も
他の人から学びました他の人の一般的な考え方次のとおりです

nums =“ -----> –>”; k = 3
結果=“ –> ----->”;
逆「-----> –>」は「<– <-----
」を取得できます逆「<–」は「–> <-----」を取得できます
逆「<----- 」を取得できます「–> ----->」

Code_3:

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        k = k % len(nums)
        self.reverse(nums, 0, len(nums) - 1)
        self.reverse(nums, 0, k - 1)
        self.reverse(nums, k, len(nums) - 1)
    
    def reverse(self, nums, start, end):
        while start < end:
            nums[start], nums[end] = nums[end], nums[start]
            start += 1
            end -= 1

運用効率も高い

おすすめ

転載: blog.csdn.net/weixin_50791900/article/details/112422478