TwoSum,从O(n^2)到O(nlogn)再到O(n)

102 篇文章 0 订阅
70 篇文章 0 订阅

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()
    
    # 遍历第一个数,需要遍历n个,查询第二个数是否在哈希表里
    for i in range(n):
        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])
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值