Python判断两数之和是否在一个数组中

本文介绍了多种解决两数之和问题的算法实现方法,包括暴力搜索、使用哈希表和双指针技术等,详细分析了每种方法的时间复杂度和空间复杂度。

import random
# O(n^2) time | O(1) space
def twoNumberSum( array, targetSum):
    for i in range (len(array) - 1):
        firstNum = array[i]
        for j in range( i+1, len(array)):
            secondNum = array[j]
            if firstNum + secondNum == targetSum:
                return [firstNum, secondNum]
    return[]

# O(n) time | O(n) space
# 只找到第一个两两之和满足条件
def twoNumberSumImp(array, targetSum):
    nums = {}
    for num in array:
        potentialMatch = targetSum - num
        if potentialMatch in nums:
            return [potentialMatch, num]
        else:
            nums[num] = True
    return []

# 如果有多个两两之和满足条件则都找到
def twoNumberSumImproved(array, targetSum):
    nums = {}
    hasElement = []
    for num in array:
        potentialMatch = targetSum - num
        if potentialMatch in nums:
            hasElement.append([potentialMatch, num])
            # return hasElement
        else:
            nums[num] = True
    return hasElement
        
#  O(nlog(n)) | O(1) space       
def twoNumSum( array, targetSum):
    array.sort()
    left = 0
    right = len(array) - 1
    while left < right:
        currentSum = array[left] + array[right]
        
        if currentSum == targetSum:
            return [array[left], array[right]] 
        elif currentSum < targetSum:
            left  += 1
        elif currentSum > targetSum:
            right -= 1
    return[]      

 

if __name__ == "__main__":
    nums = []
    targetSum = 14
    for i in range(10):
        nums.append(random.randint(0, 10))
        
    print( nums)
    print( twoNumberSum(nums, targetSum))
    print(twoNumberSumImproved(nums, targetSum))
    print(twoNumSum(nums, targetSum))

第三种方法是先从小到大排序,然后把第一个和最后一相加,其和如果比目标值小,则左边的元素向前移一位,如果其值比目标值大,则右边的元素向左移一位,进行比较。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值