トピック:
配列が与えられたら、配列の要素を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