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

C++でサブシーケンスをウィグルする


連続する数の差が正と負の間で厳密に交互になる場合、ウィグルシーケンスと呼ばれる数列があるとします。最初の違いは、正または負のいずれかです。要素が2つ未満のシーケンスは、自明なウィグルシーケンスです。したがって、たとえば、[1,7,4,9,2,5]は小刻みに動くシーケンスです。これは、表示されている場合、差(6、-3,5、-7,3)が交互に正と負であるためです。ただし、[1,4,7,2,5]と[1,7,4,5,5]はウィグルシーケンスではありません。最初のシーケンスは、最初の2つの差が正であるため、2番目のシーケンスは最後の差がゼロであるためです。 。

したがって、整数のシーケンスがあり、ウィグルシーケンスである最長のサブシーケンスの長さを見つける必要があります。サブシーケンスは、元のシーケンスからいくつかの要素(最終的にはゼロ)を削除し、残りの要素を元の順序のままにしておくことで取得されます。したがって、入力が[1,7,4,9,2,5]の場合、シーケンス全体がウィグルシーケンスであるため、出力は6になります。

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

  • n:=numsのサイズ

  • nが0の場合、0を返します

  • セットアップ:=1およびダウン:=1

  • 1からn–1の範囲のiの場合

    • nums [i]> nums [i – 1]の場合、up:=down + 1

    • それ以外の場合、nums [i]

  • 上下の最大値を返す

例(C ++)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int wiggleMaxLength(vector<int>& nums) {
      int n = nums.size();
      if(!n) return 0;
      int up = 1;
      int down = 1;
      for(int i = 1; i < n; i++){
         if(nums[i] > nums[i - 1]){
            up = down + 1;
         }
         else if(nums[i] < nums[i - 1]){
            down = up + 1;
         }
      }
      return max(up, down);
   }
};
main(){
   Solution ob;
   vector<int> v = {1,7,4,9,2,5};
   cout << (ob.wiggleMaxLength(v));
}

入力

[1,7,4,9,2,5]

出力

6

  1. 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

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

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