不修改數組找出重複的數字——Python實現

題目描述

給定一個長度爲 n+1 的數組nums,數組中所有的數均在 1∼n 的範圍內,其中 n≥1。
請找出數組中任意一個重複的數,但不能修改輸入的數組。
樣例:
給定長度爲8的數組 nums = [2, 3, 5, 4,3, 2, 6,7]
那麼輸出重複的數字2或者3.

思路

  1. 跟上一題一樣,同樣可以採用哈希表的方法,依次掃描各元素,放入哈希表中,當元素已在哈希表中存在時,則找到了重複的數。此方法時間和空間複雜度均爲O(n).
  2. 運用分治的思想,由題意:“所有數均在1~n的範圍內,長度爲n+1” 可知,必定存在重複數。首先將1 ~ n 這個區間分爲兩部分,前一部分包含數字1 ~ (1+n)/2, 後一部分包含數字(1+n)/2+1 ~ n, 統計第一部分元素個數,若個數大於(1+n)/2, 則第一部分存在重複數,否則,重複數在第二部分,然後,再繼續將含有重複數字的區間一分爲二,直至找到重複的數字。此方法時間複雜度爲O(nlogn),空間複雜度爲O(1).

參考代碼

  • 思路1
def find_dup1(array):
    hash_map = dict()
    for i, val in enumerate(array):
        if val in hash_map:
            return True, val
        hash_map[val] = i
    return False, None
  • 思路2
def find_dupc(array):
    first = 1
    last = len(array) + 1
    while first != last:
        first, last = seperate(array, first, last)
    return True, first


def seperate(a, first, last):
    mid = (first + last) // 2
    count = 0
    for i in range(0, len(a)):
        if a[i] >= first and a[i] <= mid:
            count += 1
    if count > mid - first + 1:
        return first, mid
    else:
        return mid + 1, last
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章