文章目录
- 前言
- 一、题目
- 1、原题链接
- 2、题目描述
- 二、解题报告
- 1、思路分析
- 2、时间复杂度
- 3、代码详解
前言
本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记,如有侵权,立即删除。
一、题目
1、原题链接
1. 两数之和
2、题目描述
二、解题报告
1、思路分析
(1)暴力解法,两层for循环枚举,时间复杂度O(n2)。
(2)利用哈希表,由于本题中判断条件是数组值满足一定条件,而返回的是数组下标,所以需要利用可以存储键值对的map
类型等数据结构来模拟哈希表,而unordered_map
底层为哈希表,存取效率O(1)。所以我们可以先将元素都放入哈希表中,然后来依次判断值为target-nums[i]
的元素是否在哈希表中存在(注意:此时需要另外判断这两个元素不能相同),若存在则返回答案。若不存在,继续遍历。若遍历完仍未返回答案,则返回空数组。
2、时间复杂度
时间复杂度O(n)
3、代码详解
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> m; //哈希表//将所有元素放入哈希表中for (int i = 0; i < nums.size(); i++) {//unordered_map查找时以key查找,所以key设置为数组值m.insert(pair<int, int> (nums[i], i));}//遍历数组for (int i = 0; i < nums.size(); i++) {auto iter = m.find(target - nums[i]);//如果target-nums[i]该值存在于哈希表中,而且于i不是同一元素,则返回答案 if (iter != m.end() ) { //注意:该判断条件的等价形式不可写在外层if条件中,否则可能会造成运行错误//因为可能会造成iter—>second的越界访问(迭代器越界(尾迭代),从而访问不到second)if(iter->second ==i) continue;return {i, iter->second};}}return {};}
};