給定整數數組 nums 和目標值 target,找出兩數之和等於 target 的下標。假設唯一解,不可重複使用同一元素。
示例:nums=[2,7,11,15], target=9 → [0,1]
| 方法 | 時間 | 空間 | 核心思想 |
|---|---|---|---|
| 暴力雙循環 | O(n²) | O(1) | 枚舉所有數對 |
| 排序+雙指針 | O(n log n) | O(1) 或 O(n) | 有序數組首尾夾適 |
| 哈希表 | O(n) | O(n) | 以空間換時間,單次遍歷 |
遍歷數組,對於當前元素 x,查找 target - x 是否已在哈希表中:
[map[target-x], i]。x 及其下標 i 存入哈希表,繼續。關鍵點:先查後存,避免用同一元素兩次(如 target=4, nums=[2,...])。
class Solution {
public:
vector twoSum(vector& nums, int target) {
unordered_map mp; // 值 -> 下標
for (int i = 0; i < nums.size(); ++i) {
int need = target - nums[i];
if (mp.count(need)) return {mp[need], i};
mp[nums[i]] = i;
}
return {}; // 題目保證有解,不會執行到這裡
}
};
class Solution {
public int[] twoSum(int[] nums, int target) {
Map map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int need = target - nums[i];
if (map.containsKey(need)) return new int[]{map.get(need), i};
map.put(nums[i], i);
}
throw new IllegalArgumentException("No solution");
}
}
class Solution:
def twoSum(self, nums, target):
mp = {}
for i, x in enumerate(nums):
need = target - x
if need in mp: return [mp[need], i]
mp[x] = i
add 和 find 操作的類設計。Two Sum 是哈希表典型應用的入門題。核心模式:遍歷 + 查找互補值 + 存儲當前值。這種「以空間換時間、單次遍歷」的思想廣泛應用於「三數之和」、「四數之和」、「子數組和等於 K」等問題。