📘 題目敘述
給定一個整數陣列 nums 與一個整數 target,請回傳兩個數字的索引,使得它們相加的結果等於 target。
條件限制
2 ≤ nums.length ≤ 10^4-10^9 ≤ nums[i] ≤ 10^9-10^9 ≤ target ≤ 10^9- 題目保證恰好只有一組解
🧠 解題思路
在看這題時,我的直覺想法是:
只要找到陣列中任意兩個不同位置的數字,它們相加等於 target 即可。
因此我把問題拆成兩個步驟來思考:
- 先固定第一個數字的位置
i - 再從後面的元素中,尋找是否存在另一個位置
j,使得nums[i] + nums[j] == target
只要找到一組符合條件的索引,就可以直接回傳答案,因為題目已經保證 恰好只有一組解。
在固定 i 之後,對應的第二層搜尋會出現以下幾種情況:
情況一:找到符合條件的配對
- 當
nums[i] + nums[j] == target時 - 代表目前這一組
(i, j)就是答案 - 可以立即回傳
{i, j},結束搜尋
情況二:搜尋完仍找不到符合條件的數字
- 表示以目前的
i作為第一個數字時,沒有任何可行的配對 - 此時改固定下一個
i,重複相同的搜尋流程
為什麼第二層迴圈從 j = i + 1 開始?
第二層迴圈從 j = i + 1 開始,主要是為了避免兩種不合理的情況:
- 使用到同一個元素(
i == j) - 重複檢查相同的數字配對(例如
(i, j)與(j, i))
這樣的設計可以確保:
- 兩個索引一定不同(
i ≠ j) - 每一組數字配對只會被檢查一次
也讓整個搜尋流程保持最直觀、最容易理解。
💻 程式碼實作(暴力解)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for (int i = 0; i < nums.size(); i++) {
for (int j = i + 1; j < nums.size(); j++) {
if (nums[i] + nums[j] == target) {
return {i, j};
}
}
}
return {};
}
};