Pythonで重複しない2つのサブリストの最大合計を見つけるプログラム
numsと呼ばれる数値のリストと2つの値xおよびyがあるとすると、長さxおよびyを持つnums内の重複しない2つのサブリストの最大合計を見つける必要があります。
したがって、入力がnums =[3、2、10、-2、7、6] x =3 y =1の場合、出力は22になります。これは、長さが3のサブリストとして[3、2、 10]と、その他には[7]を選択します。
これを解決するには、次の手順に従います-
- P:=単一要素0のリスト
- Aのxごとに、
- Pの最後に(P + xの最後の要素)を挿入します
- 関数solve()を定義します。これにはlen1、len2が必要です
- Q:=範囲0からP-len1のサイズまでの各iの要素(P [i + len1]-P [i])を含むリスト
- プレフィックス:=Qのコピー
- 0からプレフィックス-1のサイズまでの範囲のiの場合、do
- prefix [i + 1]:=プレフィックス[i+1]とプレフィックス[i]の最大値
- ans:=-infinity
- len1からP-len2のサイズの範囲のiの場合、
- 左:=プレフィックス[i-len1]
- 右:=P [i + len2]-P [i]
- ans:=ansの最大値と(左+右)
- 回答を返す
- メインの方法から次のようにします-
- solve(len1、len2)、solve(len2、len1)の最大値を返す
理解を深めるために、次の実装を見てみましょう-
例
class Solution: def solve(self, A, len1, len2): P = [0] for x in A: P.append(P[-1] + x) def solve(len1, len2): Q = [P[i + len1] - P[i] for i in range(len(P) - len1)] prefix = Q[:] for i in range(len(prefix) - 1): prefix[i + 1] = max(prefix[i + 1], prefix[i]) ans = float("-inf") for i in range(len1, len(P) - len2): left = prefix[i - len1] right = P[i + len2] - P[i] ans = max(ans, left + right) return ans return max(solve(len1, len2), solve(len2, len1)) ob = Solution() nums = [3, 2, 10, -2, 7, 6] x = 3 y = 1 print(ob.solve(nums, x, y))
入力
[3, 2, 10, -2, 7, 6], 3, 1
出力
22
-
Pythonでツリーの隣接していないノードの最大合計を見つけるプログラム
二分木があるとすると、2つの値が親から子に隣接できない場合に、取得できる値の最大合計を見つける必要があります。 したがって、入力が次のような場合 10、4、3が互いに隣接していないため、出力は17になります。 これを解決するには、次の手順に従います- 関数f()を定義します。これはノードを取ります ノードがnullの場合、 return(0、0) (a、b):=f(ノードの左側) (c、d):=f(ノードの右側) ペアを返します(ノード+ b+dとa+c、a + cの値の最大値) メインメソッドからf(root)を呼び出し、その最初の値を返します 理解を深めるために、次
-
いいえが2の累乗であるかどうかを調べるPythonプログラム
この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −数値が与えられているので、その数値が2の累乗であるかどうかを確認する必要があります。 これは、以下で説明する2つのアプローチを使用して解決できます。 アプローチ1:2進数で指定された数値の対数を取り、電力を取得します 例 # power of 2 def find(n): if (n == 0): return False while (n != 1): if (n %