増加部分と減少部分がPythonの2つの異なる配列からのものであるような最長のバイトニックシーケンスを見つけます
2つの配列があるとします。増加する部分が最初の配列からのものであり、最初の配列のサブシーケンスになるように、可能な限り長いビットニックシーケンスを見つける必要があります。同様に、の減少部分は、2番目の配列と2番目の配列のサブシーケンスからのものである必要があります。
したがって、入力がA =[2、6、3、5、4、6]、B =[9、7、5、8、4、3]の場合、出力は[2、3、4]になります。 、6、9、7、5、4、3]
これを解決するには、次の手順に従います-
-
関数index_ceiling()を定義します。これには、arr、T、left、right、keyが必要です
-
右-左>1、実行
-
mid:=左+(右-左)/ 2;
-
arr [T [mid]]> =keyの場合、
-
右:=半ば
-
-
それ以外の場合
-
左:=中央
-
-
-
右に戻る
-
関数long_inc_seq()を定義します。これにはAがかかります
-
n:=Aのサイズ
-
tails_idx:=サイズnの配列、0で埋める
-
prev_idx:=サイズnの配列、-1で埋める
-
長さ:=1
-
1からnの範囲のiの場合、実行します
-
A [i]
-
tails_idx [0]:=i
-
-
それ以外の場合、A [i]> A [tails_idx [length-1]]の場合、
-
prev_idx [i]:=tails_idx [length-1]
-
tails_idx [length]:=i
-
長さ:=長さ+ 1
-
-
それ以外の場合
-
pos:=index_ceiling(A、tails_idx、-1、length -1、A [i])
-
prev_idx [i]:=tails_idx [pos-1]
-
tails_idx [pos]:=i
-
-
-
i:=tails_idx [length-1]
-
i> =0の場合、実行
-
回答の最後にA[i]を挿入
-
i:=prev_idx [i]
-
-
メインの方法から、次のようにします-
-
n1:=Aのサイズ、n2:=Bのサイズ
-
long_inc_seq(A)
-
答え:=逆の答え
-
B:=リバースB
-
long_inc_seq(B)
-
回答を返す
例
理解を深めるために、次の実装を見てみましょう-
answer = [] def index_ceiling(arr,T, left,right, key): while (right - left > 1): mid = left + (right - left) // 2; if (arr[T[mid]] >= key): right = mid else: left = mid return right def long_inc_seq(A): n = len(A) tails_idx = [0]*(n) prev_idx = [-1]*(n) length = 1 for i in range(1, n): if (A[i] < A[tails_idx[0]]): tails_idx[0] = i elif (A[i] > A[tails_idx[length - 1]]): prev_idx[i] = tails_idx[length - 1] tails_idx[length] = i length += 1 else: pos = index_ceiling(A, tails_idx, -1, length - 1, A[i]) prev_idx[i] = tails_idx[pos - 1] tails_idx[pos] = i i = tails_idx[length - 1] while(i >= 0): answer.append(A[i]) i = prev_idx[i] def long_bitonic(A,B): n1 = len(A) n2 = len(B) global answer long_inc_seq(A) answer = answer[::-1] B = B[::-1] long_inc_seq(B) A = [2, 6, 3, 5, 4, 6] B = [9, 7, 5, 8, 4, 3] long_bitonic(A,B) print(answer)
入力
[2, 6, 3, 5, 4, 6], [9, 7, 5, 8, 4, 3]
出力
[2, 3, 4, 6, 9, 7, 5, 4, 3]
-
ペア要素がPythonの異なるBSTにあるように、指定された合計を持つペアを検索します
2つの二分探索木が与えられ、別の合計が与えられたとします。各ペア要素が異なるBSTに存在する必要があるように、与えられた合計に関してペアを見つける必要があります。 したがって、入力がsum=12のような場合 その場合、出力は[(6、6)、(7、5)、(9、3)]になります。 これを解決するには、次の手順に従います- 関数solve()を定義します。これには、trav1、trav2、Sumが必要です。 左:=0 右:=trav2のサイズ-1 res:=新しいリスト 左=0の間、実行 trav1 [left] + trav2 [right]がSumと
-
2つのソートされた配列から最も近いペアを見つけるためのPythonプログラム
この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 − 2つの配列が与えられたので、2つのソートされた配列から最も近いペアを見つける必要があります 次に、以下の実装のソリューションを見てみましょう- 例 # sys module import sys # pair def print_(ar1, ar2, m, n, x): # difference diff=sys.maxsize # index l = 0 r = n-1 &