LeetCode問題解(0453):配列要素を等しくする最小移動回数(Python)


テーマ:原題リンク(簡単)
解法
時間の複雑さ
くうかんふくざつさ
実行時間
Ans 1 (Python)

O(n)
時間の制限を超える
Ans 2 (Python)
O(n)
O(1)
316ms (78.52%)
LeetCodeのPython実行用は,時間の複雑さに明らかな差がない限り,実行用は一般的に同じレベルであり,参考意義としてのみ用いられる.
解法一(実際の操作法):
【考え方】
実際の操作をシミュレートし、各操作に最大値を保持し、配列内のすべての数が同じになるまで配列内の他の値を+1します.
def minMoves(self, nums: List[int]) -> int:
    step = 0
    while len(set(nums)) > 1:
        maximum = max(nums)
        nums.remove(maximum)
        nums = [i + 1 for i in nums]
        nums.append(maximum)
        step += 1
    return step

解法2(Pythonic):
【考え方】
毎回の加算は、実際には最小値を超える1を除去することに相当する.したがって,配列が配列の最小値を超えて合計いくらであるかを統計するだけでよい.
def minMoves(self, nums: List[int]) -> int:
    minimum = min(nums)
    return sum([n - minimum for n in nums])