オプション
家
ニュース
リートコードにおける配列のネスティングとは?最適解のための2025年DFSガイド

リートコードにおける配列のネスティングとは?最適解のための2025年DFSガイド

2025年11月29日
150

配列の入れ子は、最初は複雑に見えるかもしれませんが、正しい戦略によって、魅力的な挑戦に変わります。このガイドでは、LeetCodeの問題565「配列の入れ子」を徹底的に調べ、深さ優先探索(DFS)を使った解き方の包括的な探求を提供します。問題の説明、DFSが効果的な方法である理由の説明、アルゴリズムの分解、詳細なコードサンプルの提供、最適化の戦術について説明します。最後には、配列の入れ子とDFSの両方をしっかりと理解し、同様の問題に自信を持って対処できるようになります。

キーポイント

LeetCodeの配列ネスティングの問題文(問題565)を理解する。

深さ優先探索(DFS)が配列内のサイクルを特定するのに適している理由を学ぶ

DFSアルゴリズムを明確で管理しやすいステップに分解します。

JavaとPythonのコード実装をレビューします。

時間と空間の複雑さに関する考慮事項を分析します。

訪問配列の採用などの最適化手法を発見する。

ステップ・バイ・ステップの例に従って理解を深める。

配列の入れ子を理解する

問題文リートコード565

問題の正式な定義から始めましょう。n' 個の整数を含む配列 'nums' が与えられ、それぞれの値 'nums[i]' は [0, n - 1] の範囲にある。この配列は0からn-1までの数の並べ替えを表している.あなたの目的は、この配列に従って形成される最長の集合(またはサイクル)の長さを決定することである:

  1. 任意のインデックス'i'から始める.
  2. 集合の後続の要素は'nums[i]'である.
  3. その次の要素は「nums[nums[i]]」で、このパターンを続ける。
  4. この処理は、現在の集合内ですでに遭遇した要素に到達するまで続けられる。

ゴールは、配列内で見つかったそのような集合の最大の長さを返すことである。この問題では、配列構造をナビゲートし、周期的なパターンを識別する能力が試される。

深さ優先探索(DFS)が適している理由

深さ優先探索(DFS)は、サイクルの検出を含む問題に対して直感的で効果的な戦略です。配列を有向グラフとして概念化することができ、各インデックスは別のインデックスを指示します。DFSは、バックトラックする前に各分岐に沿って可能な限りトラバースすることで、そのようなグラフを系統的に探索することに長けている。DFSが配列の入れ子に適している主な理由は以下の通りである:

  • 系統的な探索:DFSは、次の経路に移る前に、可能性のある各経路を徹底的に探索し、あらゆるサイクルの完全な探索を保証します。
  • サイクルの検出:探索中に、現在のパスですでに訪問したノードに遭遇した場合、サイクルの特定に成功したことになります。このためには、訪問ノードの追跡が不可欠です。
  • 効率:ノードを訪問済みとマークすることで、冗長な計算を防ぎ、解全体を最適化します。

代替ソリューション

代替案1:DFSの反復的実装

この深さ優先探索の反復的アプローチは、再帰の代替手段を提供します。以下のJavaコードは、再帰を行わずにサイクルを検出し、その長さを計算することで、潜在的なスタック・オーバーフローの問題を回避している:

import java.util.Arrays;class Solution {public int arrayNesting(int[] nums) {int n = nums.length;boolean[] visited = new boolean[n];int maxLength = 0;for (int start = 0; start

) この実装の主な利点は

  • 次の

とおりです:

  • 反復ループが再帰に取って代わるため、スタック深度に関する懸念がなくなる
  • :どの要素が処理されたかを効率的に追跡するために、別の配列を引き続き使用する
  • :
メモリ効率:
  • 反復処理により、再帰呼び出しスタックに関連するメモリ・オーバーヘッドが削減される。

代替案2:インプレース・サイクル長計算この

方法は、入力配列内でサイクル長を直接計算することで、よりメモリ効率の高いソリューションを提供する。以下のPythonコードは、このインプレースアプローチを示しています:

class Solution:def arrayNesting(self, nums: List[int]) -> int:n = len(nums)max_length = 0for i in range(n):if nums[i] != -1:# このインデックスが処理されていない場合のみ処理を進める start = icount = 0while nums[start] != -1:next_index = nums[start]nums[start] = -1# -1に設定することで訪問済みとみなすstart = next_indexcount += 1max_length = max(max_length, count)return max_length# 例題usagenums = [5,4,0,3,1,6,2]solution = Solution()result = solution.arrayNesting(nums)print(f "Length of the longest cycle: {result}") # 出力:4

この手法の

主な

利点は以下の通り:

  • メモリフットプリントの削減:
  • メモリフットプリントの
  • 削減:元のリストを修正することで、別の訪問済み配列の必要性を排除
  • します
  • :
  • 最適化されたパフォーマンス:

DFSアルゴリズム:ステップ・バイ・ステップの実装visited

配列

nums配列と同じ長さのvisitedという名前のブール配列を使用する。visited[i]は、インデックス'i'の要素を探索した時点で真に設定される。

DFS関数 (dfs(nums, i, visited))

この再帰関数は、 'nums' 配列、開始インデックス 'i' および 'visited' 配列を受け取る。インデックス 'i' から始まる深さ優先探索を行い、発見されたサイクルの長さを返す。

  1. 基本ケース: visited[i]が既に真であれば、この要素は既に計測したサイクルの一部であることを示す。この関数は冗長な作業を避けるために0を返す。

    1. Visitedとしてマーク:異なる開始点から同じサイクルに再び入ることを防ぐために、直ちにvisited[i]をtrueとしてマーク

    2. します

    3. :

    4. next = nums[i]を使用して次のインデックスを決定し、dfs(nums, next, visited)を再帰的に呼び出してサイクルの探索を続行

    5. する

    6. :

    7. サイクルの合計の長さは、1(現在のノードの長さ)に再帰呼び出しから返された長さを加えたものになります。この値が返されます。cycle_length = 1 + dfs(nums, next, visited).

    メイン関数 (arrayNesting(nums))

    1. 'visited' 配列を初期化します:サイズnの真偽値配列を作成し、すべての値をfalseに設定する。
    2. maxLength'を0に初期化する:この変数は、見つかった最長のサイクルを追跡する
    3. :nums' 配列の各インデックス 'i' をループする
    4. : visited[i]がfalseの場合、そのインデックスからDFS探索を開始する
    5. : max_length = Math.max(max_length, dfs(nums, i, visited)).
    6. Return 'maxLength':

    pricetingtitlepricingDFSアプローチの長所と短所

    長所

    効果的なサイクルの検出:この配列のようなグラフ構造のサイクルを見つけるのに適している

    :

    明確な再帰構造:再帰的な性質は、問題を解くためのわかりやすく論理的な流れを提供します。

    短所

    スタック・オーバーフローの

    可能性

    :入力サイズが非常に大きい場合、深い再帰はスタックオーバーフローエラーを引き起こす可能性が

    ある

    :

    配列の入れ子にDFSを使用する中核的な機能と利点主要な

    コード概念とその利点

    配列の入れ子問題を解くためのDFS実装には、成功に貢献するいくつかの重要なプログラミング概念が組み込まれています:

    • 再帰性:DFSの再帰的な性質により、配列の各潜在経路を完全に探索することができ、サイクルを見逃すことがない
    • :この配列は、アルゴリズムがどの要素も2回以上処理しないようにする、効率のための基本で
    • ある
    • :
    • アルゴリズムが本質的にサイクルを検出するのは、すでに現在のトラバーサル・パスの一部になっているノードを訪問しようとするとき
    • です
    • :
    • 各サイクルの長さは、DFSが配列内を進行する際にその場で計算さ
    • れます
    • :
    • 最大
    化ステップ:
    • 最大長を継続的に更新することで、最終的な答えが見つかった最大のサイクルであることを保証
    1. します
    • 。

    コード例による理解の向上

    DFSプロセスを説明する

    ために

    、次の例を考えてみましょう。

    配列nums = [5,4,0,3,1,6,2]が与えられた場合、DFSアルゴリズムは次のように実行されます。

    1. インデックス5から、インデックス5を訪問済みとマークし、nums[5]に移動し、nums[5]は6である。
    2. インデックス6から、インデックス6を訪問済みとマークし、nums[6]に移動し、nums[6]は2である。
    3. インデックス2において、アルゴリズムはそれを訪問済みとマークし、nums[2]が0であることを発見

    する

    1. 。0は既に訪問済みであるので、サイクル[0, 5, 6, 2]は長さ4の完全なものである

    。

    この深い探索により、経路が以前に訪れたノードにループして戻り、サイクルを形成していることを自然に検出することができる。幅優先探索(BFS)は最短経路を見つけるのに適しており、この特定のタスクには直感的でない。

    この問題は余分なスペースを使わずに解決できますか?

    はい、元の入力配列を変更することでO(1)スペースで解決できます。別の'visited'配列の代わりに、'nums'配列内の訪問済みインデックスを直接マークし、その値を-1のようなセンチネル値に変更することができます。 このアプローチは元の入力データを変更することに注意することが重要です。

    配列内の数値の範囲(0からn-1)は解にどのような影響を与えるか?

    すべての値が0からn-1の間であるという制約は非常に重要である。これは、配列内のすべての値が配列自体の中で有効なインデックスであることを保証します。

    関連する質問

    nums[i]が[0, n - 1]の範囲にあるn個の整数の配列numsが与えられたとき、配列内の最長のサイクルを見つけて返す関数を書くことができますか?JavaとPythonの両方の実装を用意し

    なさい

    。

    以下は、JavaとPythonの実装で、最も長いサイクルの長さを見つけるように設計されています:import java.util.Arrays;class Solution {public int arrayNesting(int[] nums) {int n = nums.length;boolean[] visited = new boolean[n];int maxLength = 0;for (int i = 0; i int:n = len(nums)visited = [False] * nmax_length = 0for i in range(n):if not visited[i]:max_length = max(max_length, self.dfs(nums, i, visited))return max_lengthdef dfs(self, nums: List[int], start: int, visited: List[bool]) -> int:if visited[start]:return 0visited[start] = Truenext_val = nums[start]cycle_length = 1 + self.dfs(nums, next_val, visited)return cycle_length# 例 Usagenums = [5,4,0,3,1,6,2]solution = Solution()result = solution.arrayNesting(nums)print(f "Length of the longest cycle: {result}")# 出力:4これらの実装は、不要な再処理を防ぐために訪問された配列を使用して、サイクルを効率的に検出し、その長さを計算するように最適化されている。

    関連記事
    AmazonはOpenAIおよびAnthropicに続き、10億ドル規模のFDE組織を設立した。 AmazonはOpenAIおよびAnthropicに続き、10億ドル規模のFDE組織を設立した。 企業がAIの統合に苦戦する中、外部の専門家に頼る動きが広がり、サービスプロバイダーは成功した実装を確保するために専門チームを設立している。火曜日、Amazon Web Services(AWS)は、AIに特化したフォワードデプロイされたエンジニアに専念する新しい内部ユニットを発表した。これらのエンジニアは、顧客組織に組み込まれ、目的に特化したエージェントを展開し、迅速な展開を優先し、顧客が自律的に運用できるように支援する。新しい組織に関する投稿で、AWSのフロンティアAI担当バイスプレジデン
    ホワイトハウス、「スーパーインテリジェンス」のAIラベルを廃止 ホワイトハウス、「スーパーインテリジェンス」のAIラベルを廃止 プレイヤーを読み込み中…今週、ホワイトハウスはザッカーバーグ、ベゾス、マスク、そしてAnthropicのダリオ・アモダイなど、主要なテック企業のCEOをほぼ全員一堂に会させて、ドナルド・トランプ大統領が「道徳的に拘束力がある」と表現したAI安全に関する誓約書に署名させた。トランプ氏はまた、AIを「スーパーインテリジェンス」に名称変更する行政命令にも署名した。他方、MetaとOpenAIは、AIへの最大の金融投資が依然として企業部門から流入しているにもかかわらず、AI製品をよりユーザーフレンドリ
    アマゾン、データセンターの拡張にAIとクリーンエネルギーを活用 アマゾン、データセンターの拡張にAIとクリーンエネルギーを活用 アマゾンは、AI、原子力、電気自動車を活用し、インフラを拡大しつつ炭素強度を低減している。出典:アマゾンアマゾンの「2025年サステナビリティ報告書」では、このテクノロジー大手がAIと原子力への投資をどのように統合し、炭素排出量を削減しながらグローバルなインフラを拡大しているかが詳述されている。アマゾンの「2025年サステナビリティ報告書」によると、同社は3年連続で、世界中の事業で消費する電力の1
    関連特集おすすめ
    作曲 作曲のためのAI歌詞生成ツール
    作曲のためのAI歌詞生成ツール

    2026年最新の、音楽制作に最適な高評価AI歌詞アイデアツールがXIX.AIに登場!この厳選されたコレクションには、実環境でのテストを経て、高品質な歌詞のコンセプトを迅速に提供し、ユーザーの創造性を高め、音楽制作プロセスを効率化する、画期的な強力なツールが揃っています。 無料版と有料版の比較概要もご確認いただけます。今すぐチェックして、あなたにぴったりのツールを見つけましょう!

    16 ツール
    xix.ai
    漫画制作 漫画の世界観構築のためのAIキャラクターシートツール
    漫画の世界観構築のためのAIキャラクターシートツール

    2026年最新のベスト・高評価AIキャラクターシートツールがXIX.AIに登場!コミックの世界構築に最適な厳選リストには、実世界での厳格なテストを経て選出された強力なゲームチェンジャーが含まれています。無料版と有料版の比較や、毎週更新されるランキングも提供されており、創造性を高め、世界構築作業を効率化する必須ツールを見つけることができます。今すぐ探索して、AIによる優位性を解き放ちましょう!

    13 ツール
    xix.ai
    オートメーション n8nのAI自動化ツール:社内運用、データ同期、および多段階のエージェントフロー向け
    n8nのAI自動化ツール:社内運用、データ同期、および多段階のエージェントフロー向け

    2026年版、社内運用、データ同期、多段階エージェントフローに最適な最新のn8n AI自動化ツールが登場!XIX.AIは、あらゆる業務の生産性を飛躍的に向上させる、画期的な高評価ツールを厳選してリストアップしました。 各ツールは信頼性を確保するため、実環境での厳格なテストを経ており、無料版と有料版の詳細な比較や、毎週更新されるランキングも掲載されています。ぜひ試してみたいこれらのツールで、AIの真価を引き出し、ワークフローをスムーズに効率化しましょう。今すぐチェックして、あなたにぴったりのツールを見つけましょう!

    11 ツール
    xix.ai
    プロンプト マルチモデルチームに最適なプロンプト管理ツール
    マルチモデルチームに最適なプロンプト管理ツール

    2026年版:マルチモデルチーム向け、最新・最高評価のプロンプト管理ツール! XIX.AIは、無料版と有料版の比較、実環境でのテスト、詳細なランキングを掲載した、強力で画期的な「必試ツール」のコレクションを厳選しました。これらの高評価ソリューションは、ワークフローを効率化し、反復作業を排除し、チームのあらゆるプロジェクトにおいて創造性を引き出すことで、生産性を大幅に向上させます。今すぐチェックして、あなたにぴったりのツールを見つけ、今日から創作を始めましょう!

    9 ツール
    xix.ai
    ミーティングアシスタント リモートチーム向けのAI会議要約ツール
    リモートチーム向けのAI会議要約ツール

    2026年版:リモートチーム向け、最新・最高評価のAI会議要約ツール!XIX.AIは、実環境でのテストを経て、正確な文字起こしと実用的な洞察を提供する、強力で画期的な「必試」ツールを厳選しました。 無料版と有料版の比較データや詳細なランキングを参考に、生産性を高め、チームコミュニケーションを効率化する最適なツールをお選びください。今すぐチェックして、AIの力を最大限に活用しましょう!

    13 ツール
    xix.ai
    ソフトウェア開発 最高のAI DevOpsサポートツール:デプロイメント、ログ、インシデントの監視
    最高のAI DevOpsサポートツール:デプロイメント、ログ、インシデントの監視

    2026年最新かつ最も優れた高評価AI DevOpsツールを厳選し、デプロイメントの監視、ログ管理、インシデント対応に活用できます。XIX.AIは、実際の運用環境でのテストや厳格な評価基準に基づき、生産性を大幅に向上させる強力で革新的なツールを提供しています。無料版と有料版の比較情報を確認し、ご自身のワークフローに最適なソリューションを見つけてみましょう。今すぐ詳細を確認し、AIによる競争優位性を手に入れてください。

    7 ツール
    xix.ai
    コメント (1)
    0/500
    NicholasLewis
    NicholasLewis 2026年2月21日 13:00:40 JST

    Als ich das Problem gestern selbst probiert habe, habe ich ewig gebraucht. Aber die Erklärung hier, wie man mit DFS die optimalen zyklischen Muster findet, ist super nachvollziehbar. Hoffentlich kann ich das bei der nächsten Interview-Frage anwenden. 🤞

    OR