程序员面试题:Leetcode真题讲解,求两数之和
题目描述:给定一个整数数组nums , 一个目标值target , 要求在该数组中找出和为目标值的那两个整数 , 并返回他们的数组下标 。
你可以假设每种输入只会对应一个正确答案 。 但是 , 你不能重复利用这个数组中同样的元素 。
示例:给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
文章插图
解题思路
首先 , 如果想用暴力求解的话 , 我们应该怎么做?
首先会遍历数组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
vector
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;
}
};
【程序员面试题:Leetcode真题讲解,求两数之和】// Java 版
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
Map
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;
}
}
欢迎各位网友在评论区留言交流 , 一起学习 , 共同进步~
推荐阅读
- 程序员为教师妻子开发应用:将iPhone变成文档摄像头
- 悔哭!一程序员误把7500个比特币当垃圾扔掉,估算约2.4亿美元
- 2.4亿美元打水漂!程序员小哥把7500个比特币当垃圾扔掉 硬盘找不回
- 程序员开发抢茅台脚本:2天就刷榜Github
- 为什么我喜欢C语言,却非常讨厌C++?一位国外程序员的回答
- 程序员怎么保护头发?雷军回应
- 北美程序员Tinder翻车实录
- 导航|攻坚“卫星导航信号弱”难题,高德程序员联手武大学子夺得国际室内定位大赛冠军
- 长沙|视频|聚焦“数字英雄”长沙银行冠名全国首档程序员电视真人秀
- 孙玲|从流水线女工逆袭成高薪程序员 一度爆红的她现在咋样了?