程序员面试题: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;
}
};
// Java 版
class Solution {
public int[] twoSum(int[] nums, int target) {
【程序员面试题:Leetcode真题讲解,求两数之和】 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;
}
}
欢迎各位网友在评论区留言交流 , 一起学习 , 共同进步~
- 对手|一加9Pro全面曝光,或是小米11最大对手
- 面临|“熟悉的陌生人”不该被边缘化
- 页面|如何简单、快速制作流程图?上班族的画图技巧get
- 桌面|日常使用的软件及网站分享 篇一:几个动态壁纸软件和静态壁纸网站:助你美化你的桌面
- 现状|程序员现状揭秘:平均年薪20.36万,Java人才需求量最大
- Win10系统桌面|手机桌面秒变Win10电脑系统,这波操作太给力了!
- 覆盖|iPhone13Pro概念机:机身正面被屏幕全覆盖,库克想搞事情?
- 页面|流程图怎样画?老板要我帮他做个组织结构图
- 成本|越拆越亏!旧家电回收面临成本困境:拆解一台旧电视亏损超20元
- 机器人|网络里面的假消息忽悠了非常多的小喷子和小机器人