C++で配列を互いに素な間隔に分割する
配列Aがあるとすると、-
のように左右の2つのサブ配列に分割する必要があります。-
左側のサブアレイのすべての要素は、右側のサブアレイのすべての要素以下です。
-
左右のサブアレイは空ではありません。
-
左側のサブアレイのサイズは可能な限り最小です。
このような分割後の残りの長さを見つける必要があります。そのようなパーティショニングが存在することが保証されています。
したがって、入力が[5,0,3,8,6]の場合、左の配列は[5,0,3]になり、右のサブ配列は[8,6]になるため、出力は3になります。
これを解決するには、次の手順に従います-
-
n:=Aのサイズ、サイズnの配列maxxを作成します
-
minVal:=Aの最後の要素
-
maxx [0]:=A [0]
-
1からn–1の範囲のiの場合
-
maxx [i]:=A[i]とA[i– 1]
の最大値
-
-
ans:=Aのサイズ– 1
-
n –1から1までの範囲のiの場合
-
minVal:=minValとA[i]
の最小値 -
minVal> =max [i – 1]の場合、ans:=i
-
-
ansを返す
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; class Solution { public: int partitionDisjoint(vector <int>& A) { int n = A.size(); vector <int> maxx(n); int minVal = A[n - 1]; maxx[0] = A[0]; for(int i = 1; i < n; i++){ maxx[i] = max(A[i], maxx[i - 1]); } int ans = A.size() - 1; for(int i = n - 1; i >= 1; i--){ minVal = min(minVal, A[i]); if(minVal >= maxx[i - 1]){ ans = i; } } return ans; } }; main(){ vector<int> v1 = {5,0,3,8,6}; Solution ob; cout << (ob.partitionDisjoint(v1)); }
入力
[5,0,3,8,6]
出力
3
-
配列をC++関数に渡す
C ++では、配列全体を引数として関数に渡すことはできません。ただし、インデックスなしで配列の名前を指定することにより、配列へのポインタを渡すことができます。 1次元配列を関数の引数として渡したい場合は、次の3つの方法のいずれかで関数の仮パラメーターを宣言する必要があります。3つの宣言メソッドはすべて、整数ポインターが実行されることをコンパイラーに通知するため、同様の結果を生成します。受け取る必要があります。 配列を関数に渡す方法は3つあります- ポインタとしての正式なパラメータ void myFunction(int *param) { // Do so
-
Pythonで互いに素な間隔にパーティション配列を見つけるプログラム
配列numがあるとすると、-のように、それを左右と呼ばれる2つの異なるサブ配列に分割する必要があります。 左側のサブアレイの各要素は、右側のサブアレイの各要素以下です。 左右のサブアレイは空ではありません。 左側のサブアレイのサイズは可能な限り最小です。 このような分割後の残りの長さを見つける必要があります。 したがって、入力がnums =[5,0,3,8,6]の場合、左側の配列は[5,0,3]になり、右側のサブ配列は[8,6]になるため、出力は3になります。 これを解決するには、次の手順に従います- mx:=null、temp:=null、nmx:=nul