Hash表實踐 —— 兩數之和

Mysticbinary發表於2024-09-13

目錄
  • 題目背景
  • 解題思路


題目背景

image

這個題目用常規的雙迴圈就可以完成。
但不是最優解。為什麼?

看看他的步驟數:
N =【3,2,4】
求結果為6的兩個元素座標如下,
1). 3+2 = 5 不等於
2). 3+4 = 7 不等於
3). 2+4 = 6 等於,獲取座標【1,2】

規律:
2個數 = 1 個步驟
3個數 = 3 個步驟
4個數 = 6 個步驟
5個數 = 10 個步驟
6個數 = 15 個步驟
7個數 = 21 個步驟
......

如果有N個元素, 則需要N個步驟,那麼記作 O(N)。下面分析那麼這個演算法的大O是:
image

約等於 N(N) = $ N^2 $

這個演算法的時間複雜度為:O($ N^2 $).
有什麼辦法能降低這個時間複雜度嗎?

解題思路

image

def twoSum(nums, target):
    # 建立一個雜湊表來儲存值和索引
    num_to_index = {}

    # 遍歷陣列
    for i, num in enumerate(nums):
        # 計算當前數字的補數
        complement = target - num

        # 檢查補數是否在雜湊表中
        if complement in num_to_index:
            # 如果在,返回補數的索引和當前索引
            return [num_to_index[complement], i]

        # 如果不在,將當前數字及其索引存入雜湊表
        num_to_index[num] = i

    # 如果沒有找到符合條件的兩個數,返回空列表或丟擲異常
    return []

print(twoSum([3, 2, 4], 6))

模擬執行過程:

# {} 建立map

# 1) 6 - 3 = 3 , 判斷 3不在map,繼續
# map加上{3:1}

# 2) 6 - 2 = 4 , 判斷 4不在map,繼續
# map加上{3:1,2:2}

# 3) 6 - 4 = 2 , 判斷 2在map ,返回當前4和2的座標,結束。
# map{3:1,2:2}

相關文章