LeetCode-1-两数之和-Python&Java

1、题目:https://leetcode-cn.com/problems/two-sum/description/

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

1

2

3

4

给定 nums = [2, 7, 11, 15], target = 9

 

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

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 本题中用到的语言点对比

  

项目JavaPython说明
定义数组int[] numsnumsJava定义数组,[]在类型后面 int[] nums,不是变量后面;C++声明数组是 int nums[];Python不需要声明变量类型
数组长度nums.lengthlen(nums)Java中length是数组类型的变量,python是一个数组为参数的函数
定义mapMap<Integer,Integer>map=new hashMap<>()d={}人生苦短,Python最短
查询key是否在map中boolean map.containsKey(key)if key in d 
已知map的key,获得valuevalue=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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值