C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

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

  1. 配列をC++関数に渡す

    C ++では、配列全体を引数として関数に渡すことはできません。ただし、インデックスなしで配列の名前を指定することにより、配列へのポインタを渡すことができます。 1次元配列を関数の引数として渡したい場合は、次の3つの方法のいずれかで関数の仮パラメーターを宣言する必要があります。3つの宣言メソッドはすべて、整数ポインターが実行されることをコンパイラーに通知するため、同様の結果を生成します。受け取る必要があります。 配列を関数に渡す方法は3つあります- ポインタとしての正式なパラメータ void myFunction(int *param) {    // Do so

  2. Pythonで互いに素な間隔にパーティション配列を見つけるプログラム

    配列numがあるとすると、-のように、それを左右と呼ばれる2つの異なるサブ配列に分割する必要があります。 左側のサブアレイの各要素は、右側のサブアレイの各要素以下です。 左右のサブアレイは空ではありません。 左側のサブアレイのサイズは可能な限り最小です。 このような分割後の残りの長さを見つける必要があります。 したがって、入力がnums =[5,0,3,8,6]の場合、左側の配列は[5,0,3]になり、右側のサブ配列は[8,6]になるため、出力は3になります。 これを解決するには、次の手順に従います- mx:=null、temp:=null、nmx:=nul