GitHub-LT-03-源码 :large_blue_diamond:哈希表
问题描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
解法1: 双循环-最容易理解
- 执行用时:432 ms, 在所有 C++ 提交中击败了40.88%的用户
- 内存消耗:7 MB, 在所有 C++ 提交中击败了100.00%的用户
算法复杂度
O(n*n)
双重循环
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//* 双循环,先假定一个,找目标值和当前的值的差值在剩下的数组中是否相等.
for (int i = 0; i < nums.size(); i++) {
int left = target - nums[i];
for (int j = i + 1; j < nums.size(); j++) {
if (left == nums[j]) {
return { i,j };
}
}
}
return { -1,-1 };
}
};
解法2 利用哈希表的查找 - O(1)
- 执行用时:16 ms, 在所有 C++ 提交中击败了71.05%的用户
- 内存消耗:8.4 MB, 在所有 C++ 提交中击败了43.22%的用户
算法复杂度
O(n)
只需遍历一遍即可
class Solution2 {
public:
vector<int> twoSum(vector<int>& nums, int target) {
size_t size = nums.size();
unordered_map<int, int> mymap;//比map(有序,红黑树)快 unorder_map(无序,哈希表)
for (int i = 0; i < size; i++)//构造map 差值做key index作为value
mymap.insert({ nums[i],i });
for (int i = 0; i < size; i++) {//找
auto it = mymap.find(target - nums[i]);
if (it != mymap.end() and it->second != i)
return { i,mymap[target - nums[i]] };
}
return { 0,0 };
}
};