在前幾天,我們探討了如何梳理邊界條件與評估 Big-O 複雜度。在演算法解題中,陣列(Array)是最基礎也最常考的資料結構,而解決陣列問題最經典、最常被拿來優化複雜度的技巧莫過於**「雙指針(Two Pointers)」**。
面對題目時,初學者往往第一時間想到雙重迴圈的暴力解法(Brute Force)。今天我們就來示範:如何讓 ChatGPT 扮演演算法導師,引導我們發現多餘的遍歷操作,並運用左右對撞指針或快慢指針,在空間複雜度維持 O(1) 的前提下將時間壓到極致!
想要學習思維演進,可以要求 AI 按照「從粗胚到最優」的步驟逐步引導:
【雙指針優化提示詞範本】
請扮演資深演算法教練。我正在練習陣列相關問題:
[貼上題目內容]
請依照以下三階段進行拆解與指導:
我們以經典的面試高頻題為例:
給定一個長度為 n 的整數陣列 height。有 n 條垂直線,找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。回傳該容器可以儲存的最大水量。
若使用暴力解法,需用雙重迴圈列舉所有可能的兩條線組合,計算面積:
面積公式 = (right - left) * Math.min(height[left], height[right])
AI 會清楚指出對撞指針的核心數學邏輯:
left 指向陣列開頭(0),right 指向陣列結尾(n - 1)。此時「寬度(right - left)」最大。有了清晰的指針移動邏輯,代碼就變得極度精煉:
[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;
}
}
今天我們掌握了利用 AI 拆解雙指針演算法的精髓:理解指針移動背後的「貪心策略」與「剪枝邏輯」,告別盲目的暴力巢狀迴圈。