1. Two Sum

練習日期:2025-12-29

難度:Easy

類型:Array、Hash Table

📘 題目敘述

給定一個整數陣列 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 {};
    }
};

https://leetcode.com/problems/two-sum/

作者: scottnick
撰寫日期: 2025-12-29
類別:
原文連結: https://scottnick.github.io/cpp-notes/all%20problems/1-two-sum.html