4.數組中重複的數字

題目描述

在一個長度爲n的數組裏的所有數字都在0到n-1的範圍內。 數組中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出數組中任意一個重複的數字。 例如,如果輸入長度爲7的數組{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字2。

輸入示例:[2,1,3,1,4]

輸出示例:"true,1"

可複習的知識點:各大排序算法、哈希表

思路1:先進行排序,然後順序查找到第一個重複的數字。用冒泡排序時間複雜度O(n^2),該代碼中冒泡排序可添加flag進行優化,可替換成其他排序算法。

class Solution:
    # 這裏要特別注意~找到任意重複的一個值並賦值到duplication[0]
    # 函數返回True/False
    def duplicate(self, numbers, duplication):
        # 這裏用的是冒泡排序
        index=len(numbers)
        while index>1:
            for i in range(index-1):
                if numbers[i]>numbers[i+1]:
                    numbers[i],numbers[i+1]=numbers[i+1],numbers[i]
            index=index-1
        
        for j in range(len(numbers)-1):
            if numbers[j]==numbers[j+1]:
                duplication[0]=numbers[j]
                return True
        return False

冒泡排序的核心思想是每次比較處於相鄰位置的兩個數:

總共要排序n-1趟,第i趟的比較次數爲n-i次。注意:如果某一趟排序中沒有發生交換,那麼冒泡排序就可以停止了,因此上面可以加一個flag優化一下。

 

思路2:對題目進行分析,因爲長度爲n的1維數組內,數組的範圍是0~n-1。如果我們從讓每個數字呆在相同索引值的位置這一想法出發,即讓數字1呆在array[1],數字2呆在array[2]......從數組的最左端開始,判斷索引i處的數字m是否等於i,如果相等則看下一個數字,如果不相等,則把數字m跟它作爲索引查找到的值n進行交換。若m和n的值相等,那麼,重複的數就找到了。注意了,一個是索引i和i處的值m是否相等,一個是m跟m作爲索引找到的值n是否相等。每個數字最多被交換2次就能到自己的位置上去,所以時間複雜度爲O(n):假設i處的數字m此時需要和m處的數字n進行一次交換,則數字m直接到達索引m處。數字n被換到索引i處。若n==i,那麼數字n就不用再交換了,這就是它的歸宿。如果不是,數字n只要和索引n處的數進行交換就到達了它的位置。所以最多交換的次數就是n這樣的。(一頓暴風打字輸出)

兩種情況,以n=5,數字範圍在0~4之間分別舉個例子進行分析,再歸納一下:

1.數組內有重複的數,數組內順序未知:[2,4,3,2,3,1]也可能是[2,3,2,1,1,1]

2.數組內沒有重複的數,數組內順序未知:[2,0,3,1,4],如果數組內沒有重複的數,那麼肯定會從[0,n-1]都有!

Python題解:

python的引用可把人坑慘了!!!!在寫交換的時候千萬注意,類似這樣或者只用一個臨時變量是錯誤的是非常不可取的(numbers[i],numbers[numbers[i]]=numbers[numbers[i]],numbers[i]),python的變量是引用變量,當numbers[i]重新賦值後,numbers[numbers[i]]中裏面的那個會因爲剛剛的重新賦值而發生改變!!!

# -*- coding:utf-8 -*-
class Solution:
    # 這裏要特別注意~找到任意重複的一個值並賦值到duplication[0]
    # 函數返回True/False
    def duplicate(self, numbers, duplication):
        i=0
        while i <len(numbers)-1:
            if i==numbers[i]:
                i=i+1
            else:
                if numbers[i]==numbers[numbers[i]]:
                    duplication[0]=numbers[i]
                    return True
                tmp=numbers[i]
                tmp2=numbers[numbers[i]]
                numbers[i]=tmp2
                numbers[tmp]=tmp
        return False

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章