LeetCode 面试经典 150_哈希表_两数之和(44_1_C++_简单)
LeetCode 面试经典 150_哈希表_两数之和(44_1_C++_简单)
- 题目描述:
- 输入输出样例:
- 题解:
- 解题思路:
- 思路一(暴力破解法(双重循环)):
- 思路二(哈希表):
- 代码实现
- 代码实现(思路一(暴力破解法)):
- 代码实现(思路二(哈希表)):
- 以思路二为例进行调试
题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
输入输出样例:
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
题解:
解题思路:
思路一(暴力破解法(双重循环)):
1、使用双重for循环枚举元素,一重for循环的变量代表一个数字下标,判断两数之和是否满足条件。
2、复杂度分析:
① 时间复杂度:O(n²),使用了双重循环。
② 空间复杂度:O(1)。我们只需常数空间存放若干变量。
思路二(哈希表):
1、通过题目分析,当一个数位置一定时,查找另一个数字,这时联想到了哈希表的快速查找。当遍历一个数字不满足条件之后将这个数字和下标存入哈希表,方便后续的查找。
2、具体思路如下:
① 创建哈希表用于快速的查找元素。
② 遍历数组,每遍历一个不满足条件的元素将 key=元素值;value=下标。
③ 在遍历数组的同时检查:key+nums[i] 是否=target,满足条件则返回此时的两个下标,也就是此时哈希表的value和nums的下标i。
④ 如果没有查找到返回空的容器
3、复杂度分析
① 时间复杂度:O(N),其中 N 是数组中的元素数量。因遍历一遍数组且哈希表的查找为O(1)
② 空间复杂度:O(N),其中 N 是数组中的元素数量。创建哈希表的空间。
代码实现
代码实现(思路一(暴力破解法)):
class Solution1 {
public:vector<int> twoSum(vector<int>& nums, int target) {int len=nums.size();for(int i=0;i<len;i++){for(int j=i+1;j<len;j++){if(nums[i]+nums[j]==target){//返回的是一个vector包含了i和j两个元素 return {i,j};}}}//return {}; 常用于返回默认构造的对象,尤其是类和标准库容器//返回一个空的容器 return {};}
};
代码实现(思路二(哈希表)):
class Solution2 {
public:// 定义一个函数 twoSum,接受一个整数数组 nums 和一个目标值 targetvector<int> twoSum(vector<int>& nums, int target) {// 使用 unordered_map 存储已访问过的元素及其索引unordered_map<int, int> mp;// 遍历整个数组for (int i = 0; i < nums.size(); i++) {// 检查当前元素是否能够和之前的元素加和等于目标值if (mp.count(target - nums[i])) {// 如果存在,则返回当前索引和之前找到的索引return {mp[target - nums[i]], i};}// 否则,保存当前元素及其索引到哈希表中mp[nums[i]] = i;}// 如果没有找到满足条件的两个数,返回空数组return {};}
};
以思路二为例进行调试
#include<iostream>
#include<vector>
using namespace std;
class Solution2 {
public:// 定义一个函数 twoSum,接受一个整数数组 nums 和一个目标值 targetvector<int> twoSum(vector<int>& nums, int target) {// 使用 unordered_map 存储已访问过的元素及其索引unordered_map<int, int> mp;// 遍历整个数组for (int i = 0; i < nums.size(); i++) {// 检查当前元素是否能够和之前的元素加和等于目标值if (mp.count(target - nums[i])) {// 如果存在,则返回当前索引和之前找到的索引return {mp[target - nums[i]], i};}// 否则,保存当前元素及其索引到哈希表中mp[nums[i]] = i;}// 如果没有找到满足条件的两个数,返回空数组return {};}
};
int main(){vector<int> nums={2,7,11,15};int target=9;Solution2 s;vector<int> results=s.twoSum1(nums,target);cout<<"["<<results[0]<<","<<results[1]<<"]";; return 0;
}
LeetCode 面试经典 150_哈希表_两数之和(44_1)原题链接
欢迎大家和我沟通交流(✿◠‿◠)