iT邦幫忙

2026 iThome 鐵人賽

DAY 2
0
ChatGPT & Codex

從 Prompt Engineering 到 Copilot / Codex 實務 30 天系列 第 8 篇

Day 08:【陣列與雙指針】用 AI 拆解經典陣列題:從暴力解一步步優化到雙指針法

  • 分享至 

  • xImage
  •  

在前幾天,我們探討了如何梳理邊界條件與評估 Big-O 複雜度。在演算法解題中,陣列(Array)是最基礎也最常考的資料結構,而解決陣列問題最經典、最常被拿來優化複雜度的技巧莫過於**「雙指針(Two Pointers)」**。

面對題目時,初學者往往第一時間想到雙重迴圈的暴力解法(Brute Force)。今天我們就來示範:如何讓 ChatGPT 扮演演算法導師,引導我們發現多餘的遍歷操作,並運用左右對撞指針或快慢指針,在空間複雜度維持 O(1) 的前提下將時間壓到極致!


一、雙指針引導優化提示詞(Step-by-Step Prompting)

想要學習思維演進,可以要求 AI 按照「從粗胚到最優」的步驟逐步引導:

【雙指針優化提示詞範本】
請扮演資深演算法教練。我正在練習陣列相關問題:
[貼上題目內容]

請依照以下三階段進行拆解與指導:

  1. 直覺暴力解(Brute Force):先給出最直觀的暴力解法,分析其時間與空間複雜度,並點出其中的重複運算痛點。
  2. 指針思維切入:說明為何此題適用雙指針(對撞指針或快慢指針)?指針移動的規則(何時左移、何時右移)是什麼?
  3. 原地修改(In-Place)與最優 Java 實作:給出時間 O(n)、額外空間 O(1) 的 Java 最優代碼,並附帶關鍵行註解。

二、實戰案例:LeetCode 11 - Container With Most Water(盛最多水的容器)

我們以經典的面試高頻題為例:

給定一個長度為 n 的整數陣列 height。有 n 條垂直線,找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。回傳該容器可以儲存的最大水量。

步驟 1:暴力解的痛點剖析

若使用暴力解法,需用雙重迴圈列舉所有可能的兩條線組合,計算面積:
面積公式 = (right - left) * Math.min(height[left], height[right])

  • 時間複雜度:O(n²),在陣列長度達 10^5 時直接觸發 TLE。
  • 痛點所在:有很多線段組合是「絕對不可能更大」的,暴力法卻盲目地全部算了一遍。

步驟 2:向 AI 請教雙指針的移動策略

AI 會清楚指出對撞指針的核心數學邏輯:

  • 初始化:left 指向陣列開頭(0),right 指向陣列結尾(n - 1)。此時「寬度(right - left)」最大。
  • 關鍵抉擇:當前容器的高度取決於「較矮的那一側」。
    • 如果我們移動較高的那一邊,寬度必定縮小,而短板不可能變高,面積「只會更小,絕不可能變大」。
    • 因此,唯一有可能找到更大面積的機會,是移動較矮的那一側指針,期望換到更高的柱子。

三、Java 最優解實作

有了清晰的指針移動邏輯,代碼就變得極度精煉:

[Java 雙指針最優解]
public class Solution {
public int maxArea(int[] height) {
if (height == null || height.length < 2) {
return 0;
}

    int left = 0;
    int right = height.length - 1;
    int maxWater = 0;

    while (left < right) {
        int width = right - left;
        int currentHeight = Math.min(height[left], height[right]);
        int currentWater = width * currentHeight;

        // 更新最大水容量
        maxWater = Math.max(maxWater, currentWater);

        // 核心貪心邏輯:誰矮就移動誰
        if (height[left] < height[right]) {
            left++;
        } else {
            right--;
        }
    }

    return maxWater;
}

}


四、複雜度與工程視角複盤

  1. 複雜度降維成果:
    • 時間複雜度:從 O(n²) 驟降至 O(n),兩個指針最多只會相遇一次,線性掃描完成。
    • 空間複雜度:嚴格維持在 O(1),完全沒有配置額外的集合或物件,記憶體開銷降至最低。
  2. 雙指針常見的兩大流派:
    • 對撞指針(Two Pointers from Ends):適用於排序陣列搜尋、迴文檢查、盛水容器等兩端收斂場景。
    • 快慢指針(Fast & Slow Pointers):適用於鏈結串列(Linked List)判圈、尋找中點、或陣列原地去重(如 Remove Duplicates)。

今日小結與預告

今天我們掌握了利用 AI 拆解雙指針演算法的精髓:理解指針移動背後的「貪心策略」與「剪枝邏輯」,告別盲目的暴力巢狀迴圈。


上一篇
Day 07:【複雜度分析】向 AI 請教:如何評估演算法的時間複雜度(Big-O)與空間複雜度?
下一篇
Day 09:【字串處理與 Regex】複雜字串解析免頭痛:讓 AI 生成正規表達式並附帶測試
系列文
從 Prompt Engineering 到 Copilot / Codex 實務 30 天 共 18 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言