1. 两数之和:从暴力到哈希的优化之路
作为LeetCode题库的第一道题目,两数之和看似简单却蕴含着算法设计的精髓。这道题要求我们在一个整数数组中找到两个数,使它们的和等于给定的目标值,并返回这两个数的下标。
1.1 暴力解法:最直观的入门思路
暴力解法是最容易想到的方法,通过双重循环遍历所有可能的数对组合:
cpp复制class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n = nums.size();
for(int i=0; i<n; i++) {
for(int j=i+1; j<n; j++) {
if(nums[i] + nums[j] == target) {
return {i, j};
}
}
}
return {};
}
};
这个解法的时间复杂度是O(n²),空间复杂度是O(1)。虽然在小规模数据上表现尚可,但当数组长度达到题目上限10⁴时,这个解法就显得力不从心了。
注意:暴力解法在面试中通常不会被接受作为最终答案,但它可以作为思考的起点,展示你解决问题的过程。
1.2 哈希表优化:空间换时间的经典案例
更高效的解法是使用哈希表(在C++中是unordered_map)来存储已经遍历过的数字及其索引:
cpp复制class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> num_map;
for(int i=0; i<nums.size(); i++) {
int complement = target - nums[i];
if(num_map.find(complement) != num_map.end()) {
