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

Pythonで整数配列の最長連続シーケンスの長さを求める方法


整数の配列が与えられたとき、その中に含まれる最も長い連続した数値のシーケンスの長さを求める問題を考えてみましょう。たとえば、入力が [100, 4, 250, 1, 3, 2] の場合、最長の連続シーケンスは [1, 2, 3, 4] となるため、答えは 4 になります。

解法のアプローチ

この問題を線形時間 O(n) で解くために、以下の手順に従います。

  • まず配列をセット(集合)に変換し、変数 longest を 0 で初期化します。
  • セット内の各要素 i について、「i - 1 がセットに存在しない場合」のみ処理を開始します。これは i が連続シーケンスの始点であることを意味します。
  • 始点が見つかったら、current := i、streak := 0 として初期化し、i がセットに存在する間、i を 1 ずつ増やしながら streak をカウントアップしていきます。
  • 各シーケンスの探索が終わるごとに、longest を longest と streak のうち大きい方の値で更新します。
  • すべての要素を処理し終えたら、longest を結果として返します。

「i - 1 が存在しない場合のみ走査を開始する」という工夫がポイントです。これにより各要素は高々2回しか参照されないため、全体の計算量は O(n) に抑えられます。単純にソートしてから連続性を確認する方法では O(n log n) かかるため、この手法の方が効率的です。

実装例

理解を深めるために、実際のPythonコードを見てみましょう。

class Solution(object):
    def longestConsecutive(self, a):
        a = set(a)
        longest = 0
        for i in a:
            if i-1 not in a:
                current = i
                streak = 0
                while i in a:
                    i += 1
                    streak += 1
                    longest = max(longest, streak)
        return longest

ob = Solution()
print(ob.longestConsecutive([100,4,250,1,3,2]))

入力

[100,4,250,1,3,2]

出力

4

まとめ

このアルゴリズムでは、配列をセットに変換することで要素の存在確認を O(1) で行えるようにし、さらに各連続シーケンスの始点からのみ走査を開始することで無駄な計算を排除しています。その結果、時間計算量は O(n)、空間計算量は O(n) となり、大規模なデータに対しても効率的に動作します。重複する要素がある場合も、セット化の時点で自動的に除外されるため、正しく動作するのも利点です。

  1. JavaScriptで配列内の最長の連続する数列の長さを求める方法

    問題の概要 JavaScriptで、整数の配列を引数として受け取る関数を作成します。この関数は、配列内に存在する最長の連続する数列(シーケンス)の長さを見つけて返す必要があります。ここでいう「連続」とは、数値が1ずつ増加して並んでいることを意味し、要素が配列内で隣接しているかどうか(連続配置か非連続配置か)は問いません。 たとえば、入力配列が次の場合を考えてみましょう。 const arr = [4, 6, 9, 1, 2, 8, 5, 3, -1]; このとき出力は 6 になります。最も長い連続する数列が 1, 2, 3, 4, 5, 6 であり、その長さが6だからです。 アプローチ:ハッ

  2. 【C++】二分木における最長連続シーケンス経路の求め方を解説

    問題の概要二分木が与えられたとき、最長の連続シーケンス経路の長さを求める問題を考えます。ここで「経路」とは、ある開始ノードから親子のつながり(親から子へのエッジ)に沿って、木の中の任意のノードまでをたどるノードの列を指します。最長の連続経路は必ず親から子の方向へ進む必要があり、逆方向(子から親)へさかのぼることは認められません。たとえば、次のような二分木が入力として与えられた場合を考えてみましょう。この場合、最長の連続シーケンス経路は 3 → 4 → 5 となるため、出力は 3 になります。アルゴリズムのアプローチこの問題は、木を深さ優先探索(DFS)でたどりながら、連続する値の並びを追跡する