1、题目:https://leetcode-cn.com/problems/two-sum/description/
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
1 2 3 4 |
|
2、实现
Python
数据结构:字典
分析:字典(key,value)存放数组的 值和索引(nums[i],i)
求差值、用差值作为键,查询是否存在当前字典里、如果存在,就返回差值对应的索引和当前索引,否则就把当前数组值和索引放入字典。 (补充:item in d 是判断item是否是字典某个key)
复杂度:时间复杂度:O(n)空间复杂度:O(n)
(补充:dict对象的存储结构采用的是散列表(hash表),其在最优情况下查询复杂度为O(1))
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums)
#创建一个空字典
d = {}
for i in range(n):
a = target - nums[i]
#字典d中存在nums[i]配对的值时
if a in d:
return d[nums[a]],i
#否则往字典增加键/值对
else:
d[a] = x
#边往字典增加键/值对,边与nums[i]进行配对比较
Java
数据结构:hashMap
分析:在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回。
复杂度:
-
时间复杂度:O(n), 我们只遍历了包含有 n个元素的列表一次。在表中进行的每次查找只花费 O(1)的时间。
-
空间复杂度:O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表最多需要存储 n 个元素。
class Solution {
public int[] twoSum(int[] nums, int target) {
int len = nums.length;
Map<Integer,Integer> map=new HashMap<>();
for(int i=0; i<len; i++){
int otherValue= target-nums[i];
if(map.containsKey(otherValue)){
return new int[]{map.get(otherValue),i};
}
map.put(nums[i],i);
}
throw new IllegalArgumentException("no two sum solution");
}
}
3、执行对比
疑问:python的dict也是用哈希散列机制实现的,怎么执行效率差这么多??后续要再研究一下
4、Java和python 本题中用到的语言点对比
项目 | Java | Python | 说明 |
定义数组 | int[] nums | nums | Java定义数组,[]在类型后面 int[] nums,不是变量后面;C++声明数组是 int nums[];Python不需要声明变量类型 |
数组长度 | nums.length | len(nums) | Java中length是数组类型的变量,python是一个数组为参数的函数 |
定义map | Map<Integer,Integer>map=new hashMap<>() | d={} | 人生苦短,Python最短 |
查询key是否在map中 | boolean map.containsKey(key) | if key in d | |
已知map的key,获得value | value=map.get(key) | value=d[key] | |
map添加一对(key,value) | map.put(key,value) | d[key]=value | |
for 循环 | for(;;) | for i in range(len) | java也有foreach |