leetcode 1. 两数之和
- leetcode 1. 两数之和 简单难度 哈希
- 1. 题目详情
- 1. 原题链接
- 2. 基础框架
- 2. 解题思路
- 1. 题目分析
- 2. 算法原理
- 3. 时间复杂度
- 3. 代码实现
- 4. 知识与收获
leetcode 1. 两数之和 简单难度 哈希
1. 题目详情
给定一个整数数组 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
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?
1. 原题链接
leetcode 1. 两数之和
2. 基础框架
● Cpp代码框架
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {}
};
2. 解题思路
1. 题目分析
( 1 ) (1) (1) 在数组nums
中找到和为target
的两个数,并以数组的形式返回其下标。
( 2 ) (2) (2)
2. 算法原理
( 1 ) (1) (1) 首先先到暴力解法,双重for循环外层循环确定一个数nums[i]
,内层循环从[i+1, n-1]依次确定每一个nums[j]
,判断nums[i] + nums[j]
是否与target
相等。等价于找target - nums[j]
并判断是否与外层的nums[i]
相等。时间复杂度是 O ( n 2 ) O(n^2) O(n2)。如何优化呢?
( 2 ) (2) (2) 暴力算法中,我们内层循环都花在了找target - nums[i]
上了,如果把target - nums[i]
放入哈希表中,我们 O ( 1 ) O(1) O(1)时间复杂度就可以确定是否找到了target - nums[i]
了,即不需要内层循环了。
( 3 ) (3) (3) 对于nums[i]
,先在哈希表中查找target - nums[i]
是否存在:
如果存在就返回对应下标;
如果不存在就把nums[i]
放入哈希表中。
( 4 ) (4) (4) 不能先把nums[i]放入哈希表中,再查找target-nums[i],即需要排除自己找自己的情况。
3. 时间复杂度
O ( n ) O(n) O(n)
遍历一遍数组,对于每个元素nums[i],查找哈希表target-nums[i]。如果找到了就返回下标,找不到自身加入哈希表。
3. 代码实现
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hash;for(int i = 0;i < nums.size(); i++){// 对于nums[i],在哈希表中找到了target-nums[i]if(hash.find(target - nums[i]) != hash.end())return {i, hash[target - nums[i]]};// 对于nums[i],在哈希表中找不到target-nums[i],nums[i]插入哈希表hash[nums[i]] = i;}return {-1, -1};}
};
4. 知识与收获
( 1 ) (1) (1) 哈希可以实现 O ( 1 ) O(1) O(1)时间复杂度的查找,效率很高。
T h e The The E n d End End