两数之和

题目描述:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9

输出:[0,1]

解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6

输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6

输出:[0,1]

思路分析

最容易想到的做法自然是遍历数组,用两层循环查找,找到目标后将结果保存,退出结束。但此类复杂度为n方,如果面试这么写的话肯定不符合要求的。

我初次接触这个题的时候,还喜欢用另一种方法,即单层循环遍历数组,然后用python的in方法做判断,用判断if target-nums[i] in nums来寻找第二个数,虽然这么写可以在LeetCode提交结果上发现时空复杂度明显降低,但这种做法和上面方法无本质区别,因为in方法查找数组依然是O(n)的复杂度,只不过python自带的方法导致它更快一些。

最佳方法:使用哈希表,以空间换时间

代码:

class Solution(object):

    def twoSum(self, nums, target):

        """

        :type nums: List[int]

        :type target: int

        :rtype: List[int]

        """

        #定义个字典

        hashmap={}

        for i,n in enumerate(nums):

            if target-n in hashmap:#如果target-n也出现过

                return [i,hashmap[target-n]]

#直接返回这个索引,和另一个值对应索引

            hashmap[n]=i #将该值存入哈希表,注意该值为字典的键,该索引为字典的值

需要注意的是,因为我们使用的字典,此时if target-n in hashmap语句复杂度就是O(1)的,这也是哈希表的特性,与列表不同。

这样一来,时空复杂度都是O(n),问题得到较好解决。

posted @   JunanP  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示