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

C++での最長の調和のとれたサブシーケンス


整数配列があるとします。考えられるすべてのサブシーケンスの中から、最も長い調和のとれたサブシーケンスの長さを見つける必要があります。ご存知のように、調和のとれたシーケンス配列は、最大値と最小値の差が正確に1である配列です。

したがって、入力が[1,3,2,2,5,2,3,7]の場合、最も長い調和のとれたサブシーケンスは[4,3,3,3,4]であるため、出力は5になります。

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

  • 1つのマップを定義するm

  • numsのnの場合-

    • (m [n]を1増やします)

  • m −

    のキーと値のペア(k、v)の場合
    • it:=mでの(k + 1)の位置

    • 'it'がmの場合、-

      • max _:=max_の最大値とその値

  • max _

    を返す

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int findLHS(vector<int>& nums) {
      unordered_map<int, int> m;
      for (const int n : nums)
         ++m[n];
      int max_{ 0 };
      for (const auto & [ k, v ] : m) {
         auto it = m.find(k + 1);
         if (it != m.end())
            max_ = max(max_, v + it->second);
      }
      return max_;
   }
};
main(){
   Solution ob;
   vector<int> v = {2,4,3,3,6,3,4,8};
   cout << (ob.findLHS(v));
}

入力

{2,4,3,3,6,3,4,8}

出力

5

  1. C++で最も長く増加するサブシーケンスの数

    ソートされていない整数の配列が1つあるとします。最長増加部分列の数を見つける必要があるため、入力が[1、3、5、4、7]の場合、増加部分列は[1,3,5,7]であり、出力は2になります。 [1、3、4、7] これを解決するには、次の手順に従います- n:=num配列のサイズ、サイズnの2つの配列lenとcntを作成し、それらに値1を入力します。 lis:=1 1からnの範囲のiの場合 0からi–1の範囲のjの場合 nums [j]の場合、 len [i]の場合、len [i]:=len [j] + 1、およびcnt [i]:=cnt [j] それ以外の場合、len [j] +

  2. 最長共通部分列のためのC++プログラム

    サブシーケンスは、要素のセットと同じ順序のシーケンスです。シーケンス「stuv」の場合、サブシーケンスは「stu」、「tuv」、「suv」などです。 長さnの文字列の場合、文字列からサブシーケンスを作成する方法は2nあります。 例 文字列「ABCDGH」および「AEDFHR」の最長共通部分列の長さは3です。 #include <iostream> #include <string.h> using namespace std; int max(int a, int b); int lcs(char* X, char* Y, int m, int n){