給定整數數組 nums 和目標值 target,找出兩個不同下標 i, j 使 nums[i] + nums[j] == target。假設恰好存在一組解,返回下標數組(0-based)。
public int[] twoSum(int[] nums, int target) {
int n = nums.length;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if (nums[i] + nums[j] == target)
return new int[]{i, j};
}
}
return null; // 題目保證有解,理論不可達
}
✅ 簡單直觀 ❌ N=10⁴ 時會超時。
public int[] twoSum(int[] nums, int target) {
Map map = new HashMap<>(); // 值 -> 下標
for (int i = 0; i < nums.length; ++i) {
int complement = target - nums[i];
if (map.containsKey(complement))
return new int[]{map.get(complement), i};
map.put(nums[i], i);
}
return null;
}
核心思想:一邊遍歷一邊查詢「補數」是否已出現。因為先查後放,保證不會用同一元素兩次。
| 維度 | 暴力法 | 哈希法 |
|---|---|---|
| 時間複雜度 | O(N²) | O(N) |
| 空間複雜度 | O(1) | O(N) |
| 適用場景 | N ≤ 10³、教學演示 | N ≤ 10⁵、生產環境 |
| 重複值處理 | 自然正確 | 先查後放天然去重 |
List 或拋出異常。Two Sum 是哈希表「以空間換時間」的經典入門題。掌握 單遍歷+先查後放 模式,可直接套用到「四數之和 II」、「和為 K 的子數組」等變體。