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

C++で配列を厳密に増やす


2つの配列arr1とarr2があり、これらは整数を格納できると仮定します。 arr1を厳密に増やすために必要な操作の最小数を見つける必要があります。ここでは、2つのインデックス0 <=i

caPending-3nで配列arr1を厳密に増加させない場合は、-1を返します。

したがって、入力がarr1 =[1,5,3,7,8]、arr2 =[1,3,2,5]の場合、5を2に置き換えることができるため、出力は1になります。配列は[1,2,3,7,8]になります。

これを解決するには、次の手順に従います-

  • 関数solve()を定義します。これは、配列arr1、配列arr2、i、j、prev、1つの2D配列dp、

    を取ります。
  • i> =arr1のサイズの場合、-

    • 1を返す

  • j =arr2[j]およびupper

    からのarr2のサブ配列の最初の要素
  • dp [i、j]が-1に等しくない場合、-

    • dp [i、j]

      を返します
  • ret:=arr2のサイズ+1

  • prev

    • ret:=retとsolve(arr1、arr2、i + 1、j、arr1 [i]、dp)の最小値

  • j

    • ret:=retの最小値と1+solve(arr1、arr2、i + 1、j、arr2 [j]、dp)

  • dp [i、j] =ret

    を返します
  • メインの方法から、次のようにします-

  • 配列arr2を並べ替える

  • n:=arr1のサイズ

  • m:=arr2のサイズ

  • サイズ2005x2005の2D配列dpを1つ定義し、これに-1を入力します

  • ret:=resolve(arr1、arr2、0、0、-inf、dp)

  • return(ret> arr2のサイズの場合は-1、それ以外の場合はret-1)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int solve(vector<int>& arr1, vector<int>& arr2, int i, int j, int prev, vector<vector<int> >& dp){
      if (i >= arr1.size())
         return 1;
      j = upper_bound(arr2.begin() + j, arr2.end(), prev) - arr2.begin();
      if (dp[i][j] != -1)
         return dp[i][j];
      int ret = arr2.size() + 1;
      if (prev < arr1[i]) {
         ret = min(ret, solve(arr1, arr2, i + 1, j, arr1[i], dp));
      }
      if (j < arr2.size()) {
         ret = min(ret, 1 + solve(arr1, arr2, i + 1, j, arr2[j], dp));
      }
      return dp[i][j] = ret;
   }
   int makeArrayIncreasing(vector<int>& arr1, vector<int>& arr2){
      sort(arr2.begin(), arr2.end());
      int n = arr1.size();
      int m = arr2.size();
      vector<vector<int> > dp(2005, vector<int>(2005, -1));
      int ret = solve(arr1, arr2, 0, 0, INT_MIN, dp);
      return ret > arr2.size() ? -1 : ret - 1;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,5,3,7,8}, v1 = {1,3,2,5};
   cout << (ob.makeArrayIncreasing(v,v1));
}

入力

{1,5,3,7,8}, {1,3,2,5}

出力

1

  1. 文字列のC++配列

    このセクションでは、C++で文字列の配列を定義する方法を説明します。私たちが知っているように、Cには文字列がありませんでした。文字配列を使用して文字列を作成する必要があります。したがって、文字列の配列を作成するには、文字の2次元配列を作成する必要があります。各行は、その行列に異なる文字列を保持しています。 C ++には、stringというクラスがあります。このクラスオブジェクトを使用すると、文字列型データを格納し、それらを非常に効率的に使用できます。オブジェクトの配列を作成できるので、文字列の配列を簡単に作成できます。 その後、文字列型のベクトルオブジェクトを作成し、それらを配列として使用

  2. C++での並べ替え

    このセクションでは、C++で並べ替えアルゴリズムを実行する方法を説明します。並べ替えられた配列は、各要素が数値、アルファベット順などの順序で並べ替えられた配列です。バブルソート、挿入ソート、選択ソート、マージソート、クイックソート、ヒープソートなど、数値配列をソートするための多くのアルゴリズムがあります。選択ソートを使用した配列のソートの詳細については、以下を参照してください。 選択ソートは、ソートされた配列を生成するソート方法です。これは、配列内の最小の要素を繰り返し見つけて、ソートされていない部分の先頭にある要素と交換することによって行われます。 選択ソートを使用してソートされた配列を