劍指offer - 第三題

1. 題目介紹

《劍指offer》第3題 - 找出數組中重複的數字

在一個長度爲n的數組裏所有的數字都在0~n-1之間, 數組可能存在重複數字, 找出這個數組中重複的數字中的任意一個;

比如輸入長度爲7的數組{2, 3, 1, 0, 2, 5, 3}, 對應重複數字爲2, 3;


1. 利用哈希表是最常見的解法, 但是需要維護一個空間複雜度爲o(n)的哈希表;

2. 利用哈希表解法, 無法用到題中的條件"長度爲n的數組裏所有的數字都在0~n-1之間";

3. 常常需要考慮到數組爲空,數組包含特殊元素等,使程序更魯棒;


2. Python實現

def find_duplicates_num_1(List):
    """ 法一
    利用哈希表, o(n)時間複雜度, o(n)空間複雜度;
    key = 數組中的元素, value = 元素出現的次數;
    """
    num_cnt = {}
    
    for num in List:
        num_cnt[num] = num_cnt.get(num, 0) + 1
        if num_cnt[num] > 1:
            return num
    return False
    
def find_duplicates_num_2(List):
    """ 法二: o(n)時間複雜度, o(1)空間複雜度 """
    # 空串
    if len(List) == 0:
        raise(Exception("List has no number."))
    
    # List中包含0~n-1之外的數字
    if max(List) >= len(List) or min(List) < 0:
        raise(Exception("List's number must be in 0~n-1."))
    
    length = len(List)
    for i in range(length):
        if List[i] < i:
            return List[i], i
        
        while i != List[i]:
            temp = List[i]
            List[i] = List[temp]
            List[temp] = temp
    return False

if __name__ == "__main__":
    result, i = find_duplicates_num_2([])

3. C++實現




發佈了139 篇原創文章 · 獲贊 141 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章