1. 程式人生 > 其它 >劍指03:陣列中重複的數字

劍指03:陣列中重複的數字

題目:劍指 Offer 03. 陣列中重複的數字(E)
解題思路1:

首先看到題,第一眼就想到使用字典、列表或者集合等容器進行儲存,如果查到在容器中已經存在,則返回該數。
時間:\(O(N)\)
空間:\(O(N)\)

class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        dic = {}
        for i in nums:
            if i in dic:    return i
            dic[i] = 1
        return
優質解答:原地交換

遍歷陣列,由於陣列的特殊性,n個數的大小都在\([0,n-1]\)內,碰到數則判斷其是否在自己按照大小排序的位置上,如0應該在陣列的第一位即nums[0],如果不在,則將其與自己順位上的數進行交換同時進行判斷,如果該數與自己相同,則代表遇到了重複數字,直接將其返回即可;如果不同,則進行交換,交換後此時自己已經在順位上,此時繼續判斷交換的數是否來到他的順位上,如果不在其順位上則繼續進行交換,直到進行交換的兩個數都來到順位上,此時i+1繼續往後遍歷直到陣列末端。
時間:\(O(N)\)
空間:\(O(1)\)

class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        for i in range(len(nums)):
            while nums[i] != i:
                if nums[i] == nums[nums[i]]: return nums[i]
                nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
        return
遇到問題及解決方法:
  • 在選用容器時需要注意其查詢的時間複雜度,list的查詢複雜度為\(O(N)\),字典和集合則是\(O(1)\),其本質都是雜湊表,Python3.7以後字典為有序,而集合無序,所以一般選用字典即可