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

C++で最長連続増加部分列(LCIS)の長さを求める方法

問題の概要

整数の配列が与えられたとき、最長連続増加部分配列(Longest Continuous Increasing Subsequence)の長さを求める問題を考えてみましょう。「連続増加」とは、隣り合う要素が単調に増加し続けている状態を指します。

例えば、入力が [2,4,6,5,8] の場合、出力は 3 になります。最も長い連続増加部分列は [2,4,6] であり、その長さが 3 であるためです。

アルゴリズムの考え方

この問題は、配列を一度だけ走査すれば解決できます。具体的な手順は次の通りです。

  • 配列 nums のサイズが 1 以下の場合は、そのサイズをそのまま返します。
  • answer を 1、count を 1 に初期化します。answer は現時点での最大長、count は現在の連続増加の長さを記録する変数です。
  • i を 0 から配列の末尾の手前まで順にループさせます。
    • nums[i] < nums[i + 1] の場合:増加が続いているので count を 1 増やし、answermax(answer, count) で更新します。
    • それ以外の場合:増加が途切れたため、count を 1 にリセットします。
  • 最後に answer を返します。

C++による実装例

それでは、実際のコードを見てみましょう。

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int findLengthOfLCIS(vector<int>& nums) {
      if (nums.size() <= 1)
         return nums.size();
      int answer = 1, count = 1;
      for (int i = 0; i < nums.size() - 1; i++) {
         if (nums[i] < nums[i + 1]) {
            count++;
            answer = max(answer, count);
         }
         else {
            count = 1;
         }
      }
      return answer;
   }
};
main(){
   Solution ob;
   vector<int> v = {2,4,6,5,8};
   cout << (ob.findLengthOfLCIS(v));
}

実行結果

入力:

{2,4,6,5,8}

出力:

3

計算量について

このアルゴリズムの計算量は以下の通りです。

  • 時間計算量:O(n) — 配列を一度だけ走査するため、要素数 n に対して線形時間で処理できます。
  • 空間計算量:O(1) — 追加で使用するのは変数 2 つのみであり、メモリ効率が非常に良いのが特徴です。

このように、シンプルなカウンタ管理だけで最長連続増加部分列の長さを効率的に求められます。類似の「最長増加部分列(LIS)」の問題とは異なり、連続性が求められる分、動的計画法を使わずとも容易に解ける点がポイントです。

  1. C++で最長増加部分列(LIS)を求めるプログラムの解説と実装例

    最長増加部分列(Longest Increasing Subsequence:LIS)とは、数列の中から一部の要素を取り出して作った部分列のうち、各要素が直前の要素よりも常に大きくなるような列のことです。本記事では、整数の集合が与えられたときに、その最長増加部分列の長さを動的計画法(DP)を用いて求める方法を解説します。問題の例入力:整数の集合 {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15} 出力:最長増加部分列の長さ → 6 該当する部分列は 0, 2, 6, 9, 13, 15アルゴリズムの考え方この問題は動的計画法を使って効率

  2. Pythonで最長増加部分列(LIS)を二分探索で効率的に求める方法

    ソートされていない整数のリストが与えられたとき、その中から「最長増加部分列(LIS:Longest Increasing Subsequence)」の長さを求める問題を考えてみましょう。 例えば、入力が [10, 9, 2, 5, 3, 7, 101, 18] の場合、増加する部分列としては [2, 3, 7, 101] が最長となるため、答えは 4 になります。 解法のアプローチ この問題は、単純な動的計画法でも O(n²) で解けますが、「tails(末尾管理用の配列)」と二分探索を組み合わせることで、O(n log n) という高速な計算量で解くことができます。 手順は以下の通りです。