循環循環リストにフォワードパスがあるか、Pythonにないかをチェックするプログラム
numsという循環リストがあるとします。したがって、最初と最後の要素はネイバーです。したがって、任意のインデックス(i)から開始して、nums [i]が正の値の場合は、nums [i]のステップ数を前方に移動できます。それ以外の場合は、負の値の場合は後方に移動できます。パスが前方にのみ進むか、後方にのみ進むように、長さが1より大きいサイクルがあるかどうかを確認する必要があります。
したがって、入力がnums =[-1、2、-1、1、2]のようである場合、順方向パス[1-> 3-> 4-> 1] があるため、出力はTrueになります。 P>
これを解決するには、次の手順に従います-
- n:=numsのサイズ
- nが0と同じ場合、
- Falseを返す
- saw:=サイズnの配列で、0で埋める
- numsの各要素xに対してxmodnを取得してnumsを更新します
- iter:=0
- 0からn-1の範囲のiの場合、do
- nums [i]が0と同じ場合、
- 次の反復に進む
- iter:=iter + 1
- pos:=True
- neg:=True
- curr:=i
- 次のことを繰り返し実行します。
- nums[curr]とseen[curr]がiterと同じ場合、
- Trueを返す
- sawed [curr]がゼロ以外の場合、
- ループから抜け出す
- nums [curr]> 0の場合、
- neg:=False
- それ以外の場合、
- pos:=False
- negとposの両方がfalseの場合、
- ループから抜け出す
- sawed [curr]:=iter
- curr:=(curr + nums [curr] + n)mod n
- nums [curr]が0と同じ場合、
- ループから抜け出す
- nums[curr]とseen[curr]がiterと同じ場合、
- nums [i]が0と同じ場合、
- Falseを返す
例
理解を深めるために、次の実装を見てみましょう-
def solve(nums): n = len(nums) if n == 0: return False seen = [0]*n nums = [x % n for x in nums] iter = 0 for i in range(n): if nums[i] == 0: continue iter += 1 pos = True neg = True curr = i while True: if nums[curr] and seen[curr] == iter: return True if seen[curr] : break if nums[curr] > 0: neg = False else: pos = False if not neg and not pos: break seen[curr] = iter curr = (curr + nums[curr] + n) % n if nums[curr] == 0: break return False nums = [-1, 2, -1, 1, 2] print(solve(nums))
入力
[-1, 2, -1, 1, 2]
出力
True
-
グラフに共通の到達可能なノードがあるかどうかをPythonでチェックするプログラム
有向グラフのエッジリストがあり、ノードがn個あり、ノード名が0〜n-1であるとします。2つの整数値aとbもあります。 cからaに、またcからbに移動できるようなノードcがあるかどうかを確認する必要があります。 したがって、入力が次のような場合 また、a =2、b =3の場合、出力はTrueになります。これは、ここではc =0であるため、0から2、さらには0から3へのルートがあります。 これを解決するには、次の手順に従います- 関数DFS()を定義します。これは、グラフ、ノード、訪問済みを取得します ノードにアクセスしていない場合は、 ノードを訪問済みとしてマーク グラフ[ノード]
-
Pythonでヒープが最大ヒープを形成しているかどうかを確認するプログラム
ヒープツリーを表すリストがあるとします。私たちが知っているように、ヒープは完全な二分木です。要素が最大ヒープを形成しているかどうかを確認する必要があります。最大ヒープについて知っているように、すべての要素はその子の両方よりも大きくなります。 したがって、入力がnums =[8、6、4、2、0、3]のような場合、すべての要素が子よりも大きいため、出力はTrueになります。 これを解決するには、次の手順に従います- n:=numsのサイズ 0からn-1の範囲のiの場合、do m:=i * 2 num:=nums [i] m + 1