C++の3つの等しい部分
0と1の配列Aが1つあるとすると、これらの部分がすべて同じバイナリ値を表すように、配列を3つの空でない部分に分割する必要があります。それが可能な場合は、i + 1
-
A [0]、A [1]、...、A[i]は最初の部分です;
-
A [i + 1]、A [i + 2]、...、A [j-1]は2番目の部分であり、
-
A [j]、A [j + 1]、...、A[A.length-1]は3番目の部分です。
3つの部分はすべて等しいバイナリ値を持っています。それが不可能な場合は、[-1、-1]を返します。
したがって、入力が[0,1,0,1,1]の場合、出力は[0,4]
になります。これを解決するには、次の手順に従います-
-
関数getIdx()を定義します。これにより、配列a、左、右、
が取得されます。 -
(左<右およびa [左]は0と同じ)、do-
-
(左に1つ増やします)
-
-
右<(int)a.size()、do-
-
a[左]がa[右]と等しくない場合は、-1を返します
-
(左に1つ増やす)、(右に1つ増やす)
-
-
左に戻る-1
-
メインの方法から、次のようにします-
-
サイズ2の配列retを定義します。これに-1を入力します
-
num:=0、n:=Aのサイズ
-
初期化i:=0の場合、i
-
num:=num + 1(A [i]が1と同じ)の場合、それ以外の場合は0
-
-
num mod 3が0に等しくない場合、-
-
retを返す
-
-
numが0と同じ場合、-
-
戻り値{0、2}
-
-
req:=num / 3
-
idx:=n-1
-
初期化temp:=0の場合、idx> =0かつtemp
-
temp:=temp + 1(A [idx]が1と同じ)の場合、それ以外の場合は0
-
-
(idxを1増やします)
-
firstEnd:=getIdx(A、0、idx)
-
firstEnd <0の場合、-
-
retを返す
-
-
secondEnd:=getIdx(A、firstEnd + 1、idx)
-
secondEnd <0の場合、-
-
retを返す
-
-
{firstEnd、secondEnd + 1}
を返します
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: vector<int> threeEqualParts(vector<int>& A){ vector<int> ret(2, -1); int num = 0; int n = A.size(); for (int i = 0; i < n; i++) { num += (A[i] == 1); } if (num % 3 != 0) return ret; if (num == 0) { return { 0, 2 }; } int req = num / 3; int idx = n - 1; for (int temp = 0; idx >= 0 && temp < req; idx--) { temp += A[idx] == 1; } idx++; int firstEnd = getIdx(A, 0, idx); if (firstEnd < 0) return ret; int secondEnd = getIdx(A, firstEnd + 1, idx); if (secondEnd < 0) return ret; return { firstEnd, secondEnd + 1 }; } int getIdx(vector<int>& a, int left, int right){ while (left < right && a[left] == 0) left++; while (right < (int)a.size()) { if (a[left] != a[right]) return -1; left++; right++; } return left - 1; } }; main(){ Solution ob; vector<int> v = {0,1,0,1,1}; print_vector(ob.threeEqualParts(v)); }
入力
{0,1,0,1,1}
出力
[1, 4, ]
-
C++での等しい合計とXOR
この問題では、整数nが与えられます。私たちのタスクは、i =0からnまでの整数の数を見つけるプログラムを作成することです。ここで、合計はXORに等しくなります。つまり、(n + i)=(n ^ i)。 問題を理解するために例を見てみましょう 入力: n =4 出力: 4 説明: 0からnまでのiのすべての値を考慮して i =0、4 + 0 =4、4 ^ 0 =4 i =1、4 + 1 =5、4 ^ 1 =5 i =2、4 + 2 =6、4 ^ 2 =6 i =3、4 + 3 =7、4 ^ 3 =7 i =4、4 + 4 =8、4 ^ 4 =0 カウント=4 ソリュー
-
C++での等しいツリーパーティション
n個のノードを持つ二分木があるとすると、元のツリーの1つのエッジを削除した後、値の合計が等しい2つのツリーにツリーを分割できるかどうかを確認するタスクがあります。 したがって、入力が次のような場合 そうすれば、出力は真になります。 これを解決するには、次の手順に従います- 1つのスタックstを定義する 関数solve()を定義します。これはノードを取ります ノードがnullの場合、- 0を返す leftSum:=solve(ノードの左側) rightSum:=solve(ノードの権利) curr:=val + leftSum+rig