給定整數數組 nums 和目標值 target,找出兩數之和等於目標值的下標(1-based),保證唯一解。
雙重循環枚舉所有數對,超時不可取。
遍歷數組,對每個 x 查找 target - x 是否已存在哈希表中。哈希表存儲 值 -> 下標 映射。單次遍歷即可完成。
public int[] twoSum(int[] nums, int target) {
Map map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(target - nums[i]))
return new int[]{map.get(target - nums[i]), i + 1};
map.put(nums[i], i + 1);
}
return null;
}
vector twoSum(vector& nums, int target) {
unordered_map mp;
for (int i = 0; i < nums.size(); i++) {
auto it = mp.find(target - nums[i]);
if (it != mp.end()) return {it->second, i + 1};
mp[nums[i]] = i + 1;
}
return {};
}
鏈地址法實現簡易哈希表,含 put、get、contains 操作,代碼較長但原理相同。
def twoSum(self, nums, target):
mp = {}
for i, x in enumerate(nums):
if target - x in mp: return mp[target - x], i + 1
mp[x] = i + 1
O(n),單次遍歷,哈希操作均攤 O(1)O(n),哈希表存儲O(n log n),需保留原始下標O(n log n),常數較大Two Sum 是哈希表「以空間換時間」的經典入門題。掌握單次遍歷同時查找與插入的技巧,可廣泛應用於各類配對查找問題。