劍指Offer.面試題3.陣列中重複的數字
阿新 • • 發佈:2018-12-12
在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字2。
思路:
掃描此陣列,掃描到索引為i的數字m時,首先比較m是否等於i,若是,則掃描下一個;若不是,則將其與索引為m的數字進行比較,比較將產生兩種可能。若是相等,則此數字m在索引為m和i的兩處都出現了,說明這是一個重複數字,可直接返回;若不相等,則將索引為m和i的數字互換,將m放在其應在的位置。重複以上步驟,直至我們找到第一個重複數字。
程式碼:
# -*- coding:utf-8 -*- class Solution: # 這裡要特別注意~找到任意重複的一個值並賦值到duplication[0] # 函式返回True/False def duplicate(self, numbers, duplication): # write code here for i in range(len(numbers)): while numbers[i]!=i: if numbers[i]==numbers[numbers[i]]: duplication[0]=numbers[i] return True #以下交換兩個索引處的值 t=numbers[i] numbers[i]=numbers[t] numbers[t]=t return False
分析:
時間複雜度O(n),空間複雜度O(1) 儘管看上去有兩重迴圈,但是對於每個數字,最多需要兩次即可找到其自己的位置,因此總的時間複雜度是O(n)