1. 两数之和 - 力扣(LeetCode)

初期思路

开始想先遍历一遍数组把每个元素加入map,之后再进行查询,但发现下面这个示例过不了(输出会变为[0, 0])

所以实际上需要把所有操作在一次遍历中解决,这样就能实现每次查询map都只查询自己前方的元素了

Untitled

解题思路

本质还是根据一个key对哈希表进行查询

<aside> 💡 思路:target确定了,那么能和一个数相加得到target的值也唯一确定。 使用这个数本身作为key查询互补数,或是使用其互补数作为key查询这个数都行。

</aside>

由于不仅需要存储数的值还需要存储其对应的下标,所以使用map构建哈希表

// 将数组中每个数的下标作为val,将其与target的差值作为key存入map,
// 之后数组中如果出现了key值则其对应的val就是与其互补的数
vector<int> twoSum(vector<int>& nums, int target) {
	// 第一个值存储与target的差值,第二个值存储下标
	unordered_map<int, int> record;
 
	for (int i = 0; i < nums.size(); ++i) {
		if (record.find(nums[i]) == record.end()) 
			record.insert(std::make_pair(target - nums[i], i));
		else
			return { record.find(nums[i])->second, i };
	}
	// 不写返回力扣编译器无法通过
	return { 0, 0 };
}

代码随想录链接

https://programmercarl.com/0001.两数之和.html