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

Pythonで捕食者がいない動物の最小数を数えるプログラム


numsという数字のリストがあるとします。nums[i]はi番目の動物の捕食者を示し、捕食者がいない場合は-1を保持します。直接または間接の捕食者と同じグループに動物がいないように、動物のグループの数を最小限に抑える必要があります。

したがって、入力がnums =[1、2、-1、4、5、-1]のような場合、出力は3になります。これは、[0、3]、[1、4]のようなグループを持つことができるためです。 ]、[2、5]。

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

  • Aが空の場合、

    • 0を返す

  • adj:=白地図

  • vis:=新しいセット

  • roots:=新しいリスト

  • 各インデックスiとAの値aについて、実行します

    • aが-1と同じ場合、

      • ルートの最後にiを挿入します

    • adj [i]

      の最後にaを挿入します
    • adj [a]

      の最後にiを挿入します
  • 最高:=−無限大

  • ルート内のルートごとに、実行します

    • stk:=スタックし、[root、1]をスタックに挿入します

    • stkが空でない間、実行します

      • (ノード、d):=stkのポップされた要素

      • ノードがvisにあるか、ノードが-1と同じである場合、

        • ループから出てきます

      • best:=bestとdの最大値

      • visにノードを挿入

      • adj [node]のuごとに、実行

        • (u、d + 1)をstkに押し込みます

  • 最高のリターン

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

from collections import defaultdict
class Solution:
   def solve(self, A):
      if not A:
         return 0
      adj = defaultdict(list)
      vis = set()
      roots = []
      for i, a in enumerate(A):
         if a == -1:
            roots.append(i)
         adj[i].append(a)
         adj[a].append(i)
      best = −float("inf")
      for root in roots:
      stk = [(root, 1)]
      while stk:
         node, d = stk.pop()
         if node in vis or node == −1:
            continue
         best = max(best, d)
         vis.add(node)
         for u in adj[node]:
            stk.append((u, d + 1))
   return best
ob = Solution()
nums = [1, 2, −1, 4, 5, −1]
print(ob.solve(nums))

入力

[1, 2, −1, 4, 5, −1]

出力

3

  1. Pythonのsの個別の部分文字列の数をカウントするプログラム

    文字列sがあるとすると、sの個別の空でない部分文字列の数を見つける必要があります。 したがって、入力がs =abaaの場合、サブストリングは[a、 b、 ab、 ba、 aa、 aba、 であるため、出力は8になります。 baa 、abaa]。 これを解決するには、次の手順に従います- トライ:=新しい地図 n:=sのサイズ 0からn-1の範囲のiの場合、do curr:=trie iからn-1の範囲のjの場合、do c:=s [j] cがcurrにない場合は、 curr [c]:=新しいマップ curr:=curr [c] curr [*]:=True

  2. PythonでnノードのBSTの数をカウントするプログラム

    n個の異なるノードがあるとします。すべてが異なります。二分探索木を形成するためにそれらを配置できる方法の数を見つける必要があります。二分探索木で知っているように、左側のサブツリーは常に小さい値を保持し、右側のサブツリーは大きい値を保持します。 これを解決するために、カタラン数を見つけます。カタラン数C(n)は、n個の異なるキーを持つ二分探索木を表します。式は次のようになります $$ C(n)=\ frac {(2n)!} {(n + 1)!\ times n!} $$ したがって、入力がn =3の場合、出力は5になります。 これを解決するには、次の手順に従います- 関数ncr