考え(各アレイがソートされていると仮定して)
- 以下となるよう、それぞれ最大数の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
概要
私は法律を見つけることができれば、それは事を最適化されていません