TwoSum,从O(n^2)到O(nlogn)再到O(n)
生活随笔
收集整理的這篇文章主要介紹了
TwoSum,从O(n^2)到O(nlogn)再到O(n)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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)# 二分查找,logndef binary_Serach_recursive(arr,left,right,target):middle = (left + right) // 2# 遞歸出口if left > right :return Falseif arr[middle] == target:return Trueelif 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])總結
以上是生活随笔為你收集整理的TwoSum,从O(n^2)到O(nlogn)再到O(n)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法优化:动态规划加速,货物运输问题,四
- 下一篇: kSum,实现方式,动态规划