Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで任意の数とその次に小さい数の最大差を見つけるプログラム


numsと呼ばれる数のリストがあるとすると、任意の数と次に小さい数の間に存在する最大の差を見つける必要があります。私たちの目標は、これを線形時間で解決することです。

したがって、入力がnums =[14、2、6、35、12]のようである場合、35と14の差が21であるため、出力は21になります。

これを解決するには、次の手順に従います-

  • max_val:=numsの最大値、min_val:=numsの最小値

  • max_valがmin_valと同じ場合、

    • 0を返す

  • delta:=(max_val − min_val)/(nums − 1のサイズ)

  • min_map:=空のマップ(一部の値がない場合はinfとしての戻り値)

  • max_map:=空のマップ(一部の値が存在しない場合は、-infとしての戻り値)

  • res:=0、idx:=0

  • numsのnumごとに、実行します

    • idx:=((num − min_val)/ delta)のフロア

    • max_map [idx]:=max_map[idx]とnumの最大値

    • min_map [idx]:=min_map[idx]とnumの最小値

  • prev:=min_val

  • 0からnums− 1のサイズのiの場合、実行します

    • min_map [i]がinfと同じでない場合、

      • res:=resの最大値と(min_map [i] − prev)

      • 前:=max_map [i]

  • 解像度を返す

理解を深めるために、次の実装を見てみましょう-

from collections import defaultdict
import math
class Solution:
   def solve(self, nums):
      max_val = max(nums)
      min_val = min(nums)
      if max_val == min_val:
         return 0
      delta = (max_val − min_val) / (len(nums) − 1)
      min_map = defaultdict(lambda: float("inf"))
      max_map = defaultdict(lambda: float("−inf"))
      res = 0
      idx = 0
      for num in nums:
         idx = math.floor((num − min_val) / delta)
         max_map[idx] = max(max_map[idx], num)
         min_map[idx] = min(min_map[idx], num)
      prev = min_val
      for i in range(len(nums)):
         if min_map[i] != float("inf"):
            res = max(res, min_map[i] − prev)
            prev = max_map[i]
      return res
ob = Solution()
nums = [14, 2, 6, 35, 12]
print(ob.solve(nums))

入力

[14, 2, 6, 35, 12]

出力

21

  1. Pythonでノードと子孫の違いを見つけるプログラム

    二分木があるとすると、ノードとその子孫の間で最大の絶対差を見つける必要があります。 したがって、入力が次のような場合 その場合、最大の絶対差はノ​​ード8と1の間であるため、出力は7になります。 これを解決するには、次の手順に従います- 関数dfs()を定義します。これはノードを取ります ノードがnullでない場合、 正と負の無限大のリストを返す left:=dfs(ノードの左側) right:=dfs(ノードの右) res:=(left [0]、right [0]の最小値とノードの値、およびleft [1]、right [1]とノードの値の最大値)とのペア ans:

  2. Pythonで最も近い左と右の小さい要素間の最大の違いを見つける

    整数の配列があるとします。配列内の各要素の最も近い左と右の小さい要素間の最大絶対差を見つける必要があります。要素の右側または左側に小さい要素がない場合は、小さい要素としてゼロを設定します。 したがって、入力がA =[3、5、9、8、8、10、4]の場合、出力は左側の要素として4になりますL =[0、3、5、5、5、8、3 ]、右要素R =[0、4、8、4、4、4、0]、最大絶対差L [i]-R [i] =8-4 =4 これを解決するには、次の手順に従います- 関数left_small_element()を定義します。これにはA、tempが必要です n:=Aのサイズ スタ