1 两数之和——easy
-
方法1:暴力遍历
-
思路
- 遍历每个元素 (x),并查找是否存在一个值与 (target - x) 相等的目标元素
- 时间复杂度:(O(n^2)) :对于每个元素,都试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 (O(n)) 的时间。因此时间复杂度为 (O(n^2))
- 空间复杂度:(O(1))
-
code
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int n = nums.size(); //i的范围是[0,nums.size()-2],即最后取到的是向量的倒数第二个位置,与j(i+1)——倒数第一个值相加 for (int i = 0; i < n - 1; ++i) { for (int j = i + 1; j < n; ++j) { if (nums[i] + nums[j] == target) { return vector<int>{i, j}; } } } return {}; } };
-
-
方法2:hash 表
-
思路
- 为了对运行时间复杂度进行优化,需要一种更有效的方法来检查数组中是否存在目标元素。如果存在,需要找出它的索引。保持数组中的每个元素与其索引相互对应的最好方法就是 hash 表。通过以空间换取速度的方式,可以将查找时间从 (O(n)) 降低到 (O(1))。
- 使用两次迭代。在第一次迭代中,将每个元素的值和它的索引添加到 hash 表中。然后,在第二次迭代中,将检查每个元素所对应的目标元素((target - nums[i]))是否存在于表中,同时要使得该目标元素不是 (nums[i])本身
-
复杂度
- 时间复杂度:(O(n))。把包含有 (n) 个元素的列表遍历两次。由于哈希表将查找时间缩短到 (O(1)) ,所以时间复杂度为 (O(n))
- 空间复杂度:(O(n))。所需的额外空间取决于 hash 表中存储的元素数量,即 (n) 个元素
-
code
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> m; for (int i = 0; i < nums.size(); ++i) { m[nums[i]] = i; } for (int i = 0; i < nums.size(); ++i) { if (m.find(target - nums[i]) != m.end() && m[target - nums[i]] != i) { return vector<int>{i, m[target - nums[i]]}; } } return {}; } };
-