AI EducademyAIEducademy
🌳

AI基礎

🌱
AI Seeds(種)

ゼロから始める

🌿
AI Sprouts(芽)

基礎を築く

🌳
AI Branches(枝)

実践に活かす

🏕️
AI Canopy(樹冠)

深く学ぶ

🌲
AI Forest(森)

AIをマスターする

🔨

AIマスタリー

✏️
AI Sketch(スケッチ)

ゼロから始める

🪨
AI Chisel(鑿)

基礎を築く

⚒️
AI Craft(制作)

実践に活かす

💎
AI Polish(磨き上げ)

深く学ぶ

🏆
AI Masterpiece(傑作)

AIをマスターする

🚀

キャリア準備

🚀
面接ローンチパッド

旅を始めよう

🌟
行動面接マスター

ソフトスキルをマスター

💻
技術面接

コーディング面接を突破

🤖
AI・ML面接

ML面接をマスター

🏆
オファーとその先

最高のオファーを獲得

全プログラムを見る→

ラボ

7つの実験がロード済み
🧠ニューラルネットワーク プレイグラウンド🤖AIか人間か?💬プロンプトラボ🎨画像生成😊感情分析ツール💡チャットボットビルダー⚖️倫理シミュレーター
🎯模擬面接ラボへ入る→
nav.journeyブログ
🎯
概要

すべての人にAI教育をアクセス可能にする

❓
nav.faq

Common questions answered

✉️
Contact

Get in touch with us

⭐
オープンソース

GitHubで公開開発

始める
AI EducademyAIEducademy

MITライセンス。オープンソース

学ぶ

  • アカデミックス
  • レッスン
  • ラボ

コミュニティ

  • GitHub
  • 貢献する
  • 行動規範
  • 概要
  • よくある質問

サポート

  • コーヒーをおごる ☕
  • footer.terms
  • footer.privacy
  • footer.contact
AI & エンジニアリング アカデミックス›🪨 AI Chisel(鑿)›レッスン›二重ポインタとスライディングウィンドウ
👆
AI Chisel(鑿) • 中級⏱️ 15 分で読める

二重ポインタとスライディングウィンドウ

Why Scanning Smartly Matters

Imagine an AI monitoring a live video feed for suspicious activity. It cannot rewatch the entire recording every second - it needs to slide a window of attention across the stream, keeping track of just enough context. That is exactly what the two pointers and sliding window patterns do for sequential data.

Both techniques turn brute-force O(n²) scans into elegant O(n) passes.

Two pointers converging from both ends of an array and a sliding window moving across a data stream
Two pointers shrink the search space; a sliding window maintains a running view.

The Two Pointer Technique

Place two references into a sequence and move them according to a rule. There are two main flavours.

Converging Pointers

Start one pointer at each end and move them inward. Perfect for sorted data.

Classic problem - Pair Sum: Given a sorted array, find two numbers that add to a target.

function pairSum(arr, target):
    left = 0
    right = arr.length - 1
    while left < right:
        sum = arr[left] + arr[right]
        if sum == target: return (left, right)
        if sum < target: left += 1
        else: right -= 1
    return null

Because the array is sorted, moving left right increases the sum, and moving right left decreases it - guaranteeing we never miss a valid pair.

Same-Direction Pointers

Both pointers move forward, but at different speeds. Useful for partitioning or cycle detection.

Example - Remove duplicates in-place: A slow pointer marks the write position; a fast pointer scans ahead.

function removeDuplicates(arr):
    slow = 0
    for fast in 1..arr.length - 1:
        if arr[fast] != arr[slow]:
            slow += 1
            arr[slow] = arr[fast]
    return slow + 1
🧠クイックチェック

In the converging two-pointer technique on a sorted array, what should you do when the current sum is less than the target?

レッスン 1 / 100%完了
←プログラムに戻る

Discussion

Sign in to join the discussion

lessons.suggestEdit

The Sliding Window Pattern

A sliding window maintains a contiguous sub-sequence of size k (fixed) or variable length, updating aggregates incrementally instead of recalculating from scratch.

Fixed-Size Window

Slide a window of exactly k elements across the array.

Example - Maximum sum of any k consecutive elements:

function maxSubarraySum(arr, k):
    windowSum = sum(arr[0..k-1])
    best = windowSum
    for i in k..arr.length - 1:
        windowSum += arr[i] - arr[i - k]
        best = max(best, windowSum)
    return best

Each step adds the new element entering the window and subtracts the one leaving - O(1) per move.

Variable-Size Window

Expand the window to include more data, then shrink it when a constraint is violated.

Example - Longest substring without repeating characters:

function longestUnique(s):
    seen = {}
    left = 0
    best = 0
    for right in 0..s.length - 1:
        if s[right] in seen and seen[s[right]] >= left:
            left = seen[s[right]] + 1
        seen[s[right]] = right
        best = max(best, right - left + 1)
    return best
🤯
Streaming analytics platforms like Apache Flink use sliding and tumbling windows as first-class primitives - the same concept scaled to millions of events per second.

Real AI Applications

| Pattern | AI Use Case | |---------|------------| | Fixed window | Anomaly detection over the last k sensor readings | | Variable window | Finding the shortest text span containing all query keywords (search engines) | | Converging pointers | Efficient nearest-neighbour checks in sorted embedding dimensions | | Same-direction pointers | Merging sorted result lists from multiple retrieval models |

🤔
Think about it:A voice assistant buffers the last 3 seconds of audio to detect a wake word. Which pattern is this - fixed window or variable window? What happens if the wake word is longer than the buffer?

When to Use Which

  • Two pointers (converging): sorted input, pair/triplet search, palindrome checks.
  • Two pointers (same-direction): in-place modifications, fast/slow runner problems.
  • Fixed sliding window: aggregate over a known window size.
  • Variable sliding window: find the smallest or largest window satisfying a condition.
🧠クイックチェック

Which pattern would you choose to find the smallest subarray whose sum exceeds a given value?

🤔
Think about it:Could you combine two pointers with a sliding window? Think about problems where you need to find a pair within a rolling window of data - for instance, detecting duplicate transactions within a five-minute window.

Key Takeaways

  1. Two pointers eliminate nested loops by leveraging ordering or partitioning.
  2. Sliding windows maintain running state so each element is processed at most twice.
  3. Both patterns are foundational in real-time AI pipelines - from anomaly detection to search ranking.
🧠クイックチェック

What is the typical time complexity achieved by converting a brute-force nested loop into a two-pointer or sliding-window solution?