C++で合計を使用するバイナリサブアレイ
0と1の配列Aが与えられたとすると、合計Sを持つ空でないサブ配列の数を見つける必要がありますか?したがって、入力が[1,0,1,0,1]のようで、S =2の場合、サブ配列は[1,0,1,0,1]、[1,0 、1,0,1]、[1,0,1,0,1]、[1,0,1,0,1]。
これを解決するには、次の手順に従います-
-
atMost()というメソッドを定義します。これは、配列Aと整数xを取ります
。 -
x <0の場合、0を返し、j:=0を設定し、ret:=0
を設定します。 -
0からAのサイズまでの範囲のiの場合
-
xをA[i]
減らす -
x <0
-
xをA[j]増やし、jを1増やします
-
-
ret:=ret + i – j + 1
-
-
retを返す
-
メインの方法から、次のようにします-
-
ret:=atMost(A、S)– atMost(A、S – 1)
-
retを返す
&mius;
をよりよく理解するために、次の実装を見てみましょう。例
#include <bits/stdc++.h> using namespace std; class Solution { public: int atMost(vector <int>& A, int x){ if(x < 0) return 0; int j = 0; int ret = 0; for(int i = 0; i < A.size(); i++){ x -= A[i]; while(x < 0){ x += A[j]; j++; } ret += i - j + 1; } return ret; } int numSubarraysWithSum(vector<int>& A, int S) { return atMost(A, S) - atMost(A, S - 1); } }; main(){ vector<int> v1 = {1,0,1,0,1}; Solution ob; cout << (ob.numSubarraysWithSum(v1, 2)); }
入力
[1,0,1,0,1]
出力
4
-
C++のバイナリツリーで最大レベルの合計を見つける
この問題では、正と負の値を持つ二分木が与えられます。私たちのタスクは、バイナリツリーで最大レベルの合計を見つけることです。 問題の説明: 二分木があります。二分木のすべてのレベルの合計を見つけて、それらの最大値を返します。 問題を理解するために例を見てみましょう 入力: 出力: 5 説明: レベル1:3の要素の合計 レベル2の要素の合計:-3 + 4 =1 レベル3の要素の合計:5 --1 + 6-5 =5 ソリューションアプローチ この問題を解決するには、レベル順トラバーサルを使用してツリーをトラバースする必要があります。そして、レベルごとに、合計
-
C++のバイナリツリーの最大スパイラル合計
この問題では、二分木が与えられます。私たちのタスクは、C++のバイナリツリーで最大スパイラル合計を見つけるプログラムを作成することです。 スパイラルサム 二分木のスパイラルトラバーサルで遭遇するノードの合計です。 ツリーのスパイラルトラバーサルでは、ノードはルートからリーフノードにトラバースされます。トラバーサルは左から右に行われ、次のレベルでは右から左に、以下同様に次のレベルで行われます。 例 − 出力 −5 説明 − ツリーの第2レベルの最初のノードまでスパイラルトラバーサルを検討します。 1+ 5 = 5. 3行目の合計要素は(1-9 + 6-4 =-6)であり