leetcode - 配列要素の最小数に等しいの動きよう

考え(各アレイがソートされていると仮定して)

  • 以下となるよう、それぞれ最大数のn-1プラス1、直接暴力ソリューションタイムアウト
  • 第1の改良: - (最初のPythonコード下記参照)暴力を解決するために再び基づいて、最小時間最小要素を作るためには、最大の要素は、少なくともアレイ最大に等しいです
  • IIの改良:2は、これまでに等しくなるまで、ソリューション全体のプロセスは、これまで最大のキャッチ最小です。\(MAX_ {0} \)元の配列の最大値は、更新された\(MAX_ {1} \)のn-1プラス最後の元の配列の\((最大-最小)\ ) \ (MAX_ {2} \)のn-2番目のプラス最後の元の配列の\((MIN-MAX)\) ...毎分に見出すことができるが、最後に最大であります
  • 動きの最終的な数である\(移動= \ sum_ {I = 1} ^ {N-1}([I] -a [0])\) nは、配列の長さであります

# 暴力求解 -> 超时
class Solution:
    def minMoves(self, nums) -> int:
        nums = sorted(nums)
        if len(nums) == 2:
            return nums[1]-nums[0]
        if len(nums) == 1 or len(nums) == 0:
            return 0
        if nums[0] == nums[-2]:
            return nums[-1] - nums[0]
        # 达到目的必然会移动不少于max-min步, 因为最后的结果的max一定是大于原有max的, 所以min至少要先移动到原有max那里去
        count = nums[-1]-nums[0]
        for i in range(len(nums) - 1):
            nums[i] += count
        nums = sorted(nums)
        while nums[0] != nums[-1]:
            for i in range(len(nums)-1):
                nums[i] += 1
            count += 1
            nums = sorted(nums)
        return count

# 学习官方求解 修改后的 -> 通过
# 其实优化过程, 就是个找规律的过程
class Solution:
    def minMoves(self, nums):
        sums = sum(nums)
        mins = min(nums)
        mul = mins*len(nums)
        return sums - mul

概要

私は法律を見つけることができれば、それは事を最適化されていません

おすすめ

転載: www.cnblogs.com/NFii/p/11542554.html