程序员面试题:Leetcode真题讲解,求两数之和

题目描述:给定一个整数数组nums , 一个目标值target , 要求在该数组中找出和为目标值的那两个整数 , 并返回他们的数组下标 。
你可以假设每种输入只会对应一个正确答案 。 但是 , 你不能重复利用这个数组中同样的元素 。
示例:给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
程序员面试题:Leetcode真题讲解,求两数之和文章插图
解题思路
首先 , 如果想用暴力求解的话 , 我们应该怎么做?
首先会遍历数组a , 然后看除了a数组中有没有target-a的数 , 这样的话就能保证该数组有两个数和等于target , 但是这个时候时间复杂度为o(n^2) 。
接下来 , 就要想一想怎么才能更快一点呢?
没错 , 我们可以借用哈希(python叫字典) , 当遍历元素的同时 , 记录元素的下标;当我们找target-a时候 , 只需要在字典找 , 就可以了 , 查找字典时间复杂度为o(1) 。
最后:
时间复杂度:o(n)
空间复杂度:o(n)
参考代码// Python版
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums)
lookup = {}
for i in range(n):
tmp = target - nums[i]
if tmp in lookup:
return [lookup[tmp], i]
lookup[nums[i]] = i
// C++ 版
class Solution {
public:
vector twoSum(vector
vector res;
for(int i = 0; i < nums.size(); i++)
{
int num_to_find = target - nums[i];
if(lookup.find(num_to_find) != lookup.end())
{
res.push_back(lookup[num_to_find]);
res.push_back(i);
return res ;
}
lookup[nums[i]] = i;
}
return res;
}
};
// Java 版
class Solution {
public int[] twoSum(int[] nums, int target) {
【程序员面试题:Leetcode真题讲解,求两数之和】 int[] result = new int[2];
Map map = new HashMap();
for (int i = 0; i < nums.length; i++){
if (map.containsKey(target - nums[i])){
result[1] = i ;
result[0] = map.get(target - nums[i]);
return result;
}
map.put(nums[i],i);
}
return result;
}
}
欢迎各位网友在评论区留言交流 , 一起学习 , 共同进步~