📘 題目敘述
給定一個整數陣列 nums,其中只會包含 0、1、2。
如果一組索引 (i, j) 滿足:
nums[i] == 1nums[j] == 2
那麼這組 (i, j) 就叫做一組有效配對(valid pair)。
請回傳所有有效配對中,abs(i - j) 的最小值。 如果根本不存在任何有效配對,回傳 -1。
條件限制
1 <= nums.length <= 1000 <= nums[i] <= 2
🧠 解題思路
我這份寫法就是直接暴力枚舉所有 (i, j)。
因為題目要找的是:
- 一個位置放
1 - 另一個位置放
2 - 並且希望它們的索引距離最小
所以我就直接把所有兩個位置都試一次。 如果目前這組 (i, j) 剛好符合 nums[i] == 1 && nums[j] == 2,我就用 abs(i - j) 去更新答案。
由於 nums.length <= 100,直接用雙迴圈把所有組合掃過一次也完全可以接受。
所有變數
n:陣列長度ans:目前找到的最小索引差,一開始先設成10000當作還沒找到答案的標記
🪜 主要流程步驟
1. 先準備陣列長度與初始答案
我先用 n 記住陣列長度,這樣後面寫迴圈比較方便。
接著我把 ans 設成 10000,意思是目前還沒有找到任何合法配對。 因為題目長度最多只有 100,所以真正的索引距離不可能大到 10000,拿它來當初始值很安全。
2. 用雙層迴圈枚舉所有 (i, j)
我用兩層 for 迴圈,把所有索引組合都掃過一次:
- 外層固定
i - 內層枚舉所有
j
這樣就能檢查每一組 (i, j) 是否為題目要的有效配對。
3. 只在 nums[i] == 1 && nums[j] == 2 時更新答案
如果目前這組索引滿足:
nums[i] == 1 && nums[j] == 2
就代表這是一組合法配對。
這時候我就計算它們的索引距離:
abs(i - j)
然後用:
ans = min(ans, abs(i - j));
把目前最小答案更新掉。
這樣整個掃描結束後,ans 裡面留下來的就是所有合法配對中最小的距離。
4. 最後判斷到底有沒有找到合法配對
如果最後 ans 仍然是初始值 10000,就代表整個陣列裡根本沒有任何 (i, j) 使得:
nums[i] == 1nums[j] == 2
這時候題目要求回傳 -1。
否則就直接回傳 ans。
⏱️ 複雜度
設 n = nums.length。
- 時間複雜度:
O(n^2)
我用雙層迴圈枚舉所有 (i, j) 組合。
- 空間複雜度:
O(1)
只用了固定數量的變數。
💻 程式碼實作
class Solution {
public:
int minAbsoluteDifference(vector<int>& nums) {
int n = nums.size();
int ans = 10000;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (nums[i] == 1 && nums[j] == 2) {
ans = min(ans, abs(i - j));
}
}
}
return (ans == 10000) ? -1 : ans;
}
};