TwoSum,两数之和

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,

介绍从O(n^2)到O(nlogn)再到O(n)的三种算法

第一种双针模型,蛮力算法:

# 双针模型,蛮力算法,时间复杂度O(n^2)
def twoSum_two_pointer(arr,target):
    n = len(arr)
    # i为第一个数的位置,j为第二个数的位置
    for i in range(n-1):
        rest = target - arr[i]
        for j in range(i+1,n):
            if arr[j] == rest:
                return True,[arr[i],rest]
    
    return False

第二种基于排序的二分查找:

# 利用有序的数组,寻找第二个数时,可以使用二分查找法为logn,整个时间复杂度为O(nlogn)
def twoSum_sorted_binary_Serach(arr,target):
    n = len(arr)
    # 排序O(nlogn)
    arr = sorted(arr)
    
    # 二分查找,logn
    def binary_Serach_recursive(arr,left,right,target):
        
        middle = (left + right) // 2
        # 递归出口
        if left > right :
            return False
        
        if arr[middle] == target:
            return True
                
        elif arr[middle] < target:
            # 这里没有return的话,结果就没法return出来
            return binary_Serach_recursive(arr,middle+1,right,target)
            
        else:
            return binary_Serach_recursive(arr,left,middle-1,target)
    
    # 遍历第一个数,查询第二个数
    for i in range(n-1):
        rest = target - arr[i]
        if binary_Serach_recursive(arr,i+1,n-1,rest):
            return True,[arr[i],rest]
         
    return False

第三种基于哈希的查找:

# python里面set使用的是哈希方式实现,查找时间复杂度O(1),整体时间复杂度O(n)       
def twoSum_hash(arr,target):
    n = len(arr)
    # 哈希表
    visit = set()
    
    # 遍历第一个数,查询第二个数是否在哈希表里
    for i in range(n-1):
        rest = target - arr[i]
        if rest in visit:
            return True,[arr[i],rest]
        # 假如这个数不再哈希表里,就添加到哈希表里面,这种操作步骤,已经保证
        # 任意两个数都组合过
        # 当遇到ab比较,ba就没必要比较时,指针对应的就是i,j =i+1,而在哈希里,对应的
        # 就是逐步加入元素
        visit.add(arr[i])
    
    return False

结果

arr = [16,7,8,44,2,4,5,97,5,3]
print(twoSum_hash(arr,100))
print(twoSum_two_pointer(arr,100))
print(twoSum_sorted_binary_Serach(arr,100))

runfile(\'D:/share/test/two_sum.py\', wdir=\'D:/share/test\')
(True, [3, 97])
(True, [97, 3])
(True, [3, 97])
收藏 打印