Python剑指offer:数组中重复的数字
題目一:找出數組中重復的數字
在一個長度為n的數組里的所有數字都在0~n-1的范圍內。數組中某些數字是重復的,但不知道有幾個數字重復了,也不知道每個數字重復了幾次。請找出數組中任意一個重復的數字。例如,如果輸入長度為7的數組{2, 3, 1, 0, 2, 5, 3},那么對應的輸出是重復的數字2或者3
思路一
解決這個問題一個簡單方法是把輸入的數組排序,將數組排序之后從排序的數組中找出重復的數字是一個很容易的事情,只需從頭到尾掃描排序后的數組就可以了,排序一個長度為n的數組需要O(nlogn)時間。
思路二
還可以用哈希表來解決這個問題,從頭到尾掃描數組中的每個數字,每掃描到一個數字的時候,就可以用O(1)的時間來判斷哈希表里是否包含這個數字。如果哈希表里還沒有這個數字,就可以把它加入哈希表里。如果哈希表包含這個數字,那么就找到一個重復數字。這個算法的時間復雜度是O(n),但它提高效率是以一個大小為O(n)的哈希表為代價的。有沒有可能有更好的算法,把空間復雜度降低到O(1),答案是有的。
思路三
要想找到特定問題最優算法,一定要觀察該特定問題的特點。而這個問題的特點是,數組中出現的數字都在0~n-1范圍之內。那么根據這個特點,如果數組中沒有重復數字,那么應該下標和數字是一一對應的關系。當數組中出現重復數字之后,我們可以想象一下,會出現多個數字對應一個下標,而有的下標不對應任何數字。
我們抓住這個特點,使用第二個哈希表的思路,不過我們可以不用重新建立新的哈希表。只需要在原有的數組上改就可以了。簡單來說,我們就是捋順改列表中元素和位置對應關系,讓盡可能元素和位置是一一對應的。具體來說,從頭到尾掃描數組中每個數字。當掃描到下標為i的數字時候,首先比較這個數字(比如說這個數字的值是m)是不是為等于i。如果是,接著掃描下一個數字。如果該位置的數值m不等于i。那么,就把這個數字m和第m個位置的數字進行比較,如果相等,就找到一個重復數字。如果他和第m個位置的數字不想等,就把第i個位置和第m個位置的兩個位置的數字進行交換。把數字m放到他應有的位置上。
def repeatable_num(a):if a == []:return "請輸入含有具體數值的數組"repeat_num = []for i in range(len(a)):if i != a[i]:if a[i] == a[a[i]]:repeat_num.append(a[i])else:temp = a[i]a[i] = a[temp]a[temp] = tempreturn repeat_num總結
以上是生活随笔為你收集整理的Python剑指offer:数组中重复的数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode:3. Longest
- 下一篇: Python剑指offer:矩形覆盖问题