劍指03:陣列中重複的數字
阿新 • • 發佈:2022-04-01
題目:劍指 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以後字典為有序,而集合無序,所以一般選用字典即可