Leecode-1两数之和

本文深入探讨了经典的“两数之和”问题,提供了三种不同的解决方案:暴力法、两遍哈希表和一遍哈希表。通过对每种方法的详细分析,帮助读者理解其工作原理,提高算法设计能力。

一、题目描述

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的 两个 整数。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

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

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

二、题目分析

题目注意点,不能重复利用数组中同样的元素,比如: nums=[2,3,4], target=6,则只能是2+4=6,而不能是3+3=6.

1.暴力法

通过两层for循环,逐个查找两者之和等于target的元素,而且应该避免重复计算和使用。
Python3实现:

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        # 第一层循环查找第一个元素索引
        for m in range(len(nums)):
        #第二层循环查找除了第一个元素的索引
            for j in range(m+1,len(nums)):
            #判断两者之和是否为target
                if (nums[m]+nums[j])==target:
                    return m,j  #如果是,立即返回元素索引
                    break  #立即退出循环,避免重复计算
                return "No two sum solution" # 如果没有查询到,则返回提示字符串

2.两遍哈希表

哈希表:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
(类似字典,通过一个键读取一个值的时间是接近O(1) )

思路:

第一层循环构建哈希表,即取数组nums的值与索引构成字典,第二层循环遍历数组,查找相减之后的元素是否在字典中,并且不能重复。
Python3实现:

class Solution:
    def twoSum(self, nums, target):
        haxi1={}
        for i in range(len(nums)):
            haxi1[nums[i]]=i   #取数组nums的值与索引构成字典
        for j in range(len(nums)):
            temp = target - nums[j]  
            #判断相减之后的元素是否在字典中,并且不能重复
            if (temp in haxi1.keys()) and (haxi1.get(temp) != j):
                return j,haxi1.get(temp)

注意:
haxi1.keys()表示返回所有字典值,是一个字典,temp in haxi1.keys()很重要,缩短搜索时间。
haxi1.get(temp)表示获取temp键所对应的值,也可以直接haxi1[
temp]。

2.一遍哈希表

思路:

一遍哈希表,即只有一层循环,通过边建立哈希表,边查找满足条件的值,再输出,并且要避免重复使用数组元素。

class Solution:
    def twoSum(self, nums, target):
    haxi={}
    for i in range(len(nums())):  #注意,必须用range生产list,进行迭代
        temp = target - nums[i]
        if temp in haxi.key(temp):
            return i,haxi.get(temp)
        haxi[nums[i]] = i 

分析:一遍哈希表,通过一次循环,刚开始哈希表为空,不满足要求,不断建立哈希表,然后边建立边判断,注意点:最后一句建立哈希表不能放在循环刚开始,因为这样才可以保证循环元素比哈希表元素提前,避免重复使用数组元素!

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        haxi={}
        for i in range(len(nums)):
            temp = target - nums[i]
            if temp in haxi.keys():
                return i,haxi.get(temp)
                break
            haxi[nums[i]] = i

反思:
1.出错:‘list’ object is not callable,是因为吧nums写成了for i in range(len(nums())),即多加了括号!!!
2.出错:syntaxerror return outside function,是因为函数内部代码没有与def错开!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值