1. 程式人生 > >劍指Offer.面試題3.陣列中重複的數字

劍指Offer.面試題3.陣列中重複的數字

在一個長度為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)