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

C++での順列シーケンス


セットが[1,2,3、...、n]のようで、合計nが含まれているとします。ユニークな順列。すべての順列を順番にリストしてラベルを付けることにより、n =3のこれらのシーケンスを取得します。["123"、 "132"、 "213"、 "231"、 "312"、 "321"]したがって、nとkの場合が与えられたら、k番目の順列シーケンスを返します。 nは1から9(両端を含む)になり、kは1からnになります! (包括的)。たとえば、n=3の場合。

手順を見てみましょう-

  • ans:=空の文字列、サイズnの候補と呼ばれる配列を定義
  • 0からn–1の範囲のiの場合
    • 候補者[i]:=((i + 1)+文字「0」)
  • サイズn+1のfactという1つの配列を作成し、fact [0]:=1を設定します
  • 1からnの範囲のiの場合
    • fact [i]:=fact [i – 1] * i
  • kを1減らします
  • for i:=n –1から0まで
    • idx:=k / fact [i]
    • ans:=ans+候補者[idx]
    • for j:=idx、j +1<候補のサイズ
      • 候補者[j]:=候補者[j + 1]
    • k:=k mod fact [i]
  • 回答を返す

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

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
   public:
   string getPermutation(int n, int k) {
      string ans = "";
      vector <char> candidates(n);
      for(lli i = 0; i < n; i++)
         candidates[i] = ((i + 1) + '0');
      vector <lli> fact(n + 1);
      fact[0] = 1;
      for(lli i = 1; i <= n; i++)
         fact[i] = fact[i - 1] * i;
      k--;
      for(lli i = n - 1; i >= 0; i--){
         lli idx = k / fact[i];
         ans += candidates[idx];
         for(lli j = idx; j + 1< candidates.size(); j++)
            candidates[j] = candidates[j + 1];
         k = k % fact[i];
      }
      return ans;
   }
};
main(){
   Solution ob;
   cout << ob.getPermutation(4, 9);
}

入力

4
9

出力

2314

  1. C++のアリコット数列

    アリコット数列 数列の特別なシーケンスです。シーケンスは番号自体から始まり、シーケンスの次の番号は前の項の適切な除数の合計です。 概念をよりよく学ぶためにシーケンスの例を見てみましょう- 入力:8出力:8 7 1 0説明:8の適切な除数は4、2、1です。合計は7です。7の適切な除数は1です。合計は1です。1の適切な除数は0です。合計は0 完全数は、長さが1のアリコット数列を持つ数です。たとえば、6は完全数です。 友愛数は、長さが2のアリコット数列を持つ数です。たとえば、1は友愛数です。 社交数は、長さが3のアリコット数列を持つ数です。たとえば、7は社交数です。 数値からアリックシーケ

  2. C++での辞書式順序の次の順列

    ここでは、C++で文字列の辞書式順序で次の順列を生成する方法を説明します。辞書式順序の次の順列は、基本的にはより大きな順列です。たとえば、「ACB」の次は「BAC」になります。 「BBB」や「DCBA」など、辞書式順序で次の順列が存在しない場合もあります。 C ++では、next_permutation()というライブラリ関数を使用してこれを行うことができます。これは、アルゴリズムヘッダーファイルにあります。 例 #include <iostream> #include <algorithm> using namespace std; main() {