找出數組中重複的數字。數組
在一個長度爲 n 的數組 nums 裏的全部數字都在 0~n-1 的範圍內。數組中某些數字是重複的,但不知道有幾個數字重複了,也不知道每一個數字重複了幾回。請找出數組中任意一個重複的數字。code
示例 1:排序
輸入: [2, 3, 1, 0, 2, 5, 3] 輸出:2 或 3
哈希表法
: 因爲只須要找出數組中任意一個重複的數字,所以遍歷數組,遇到重複的數字即返回。爲了判斷一個數字是否重複遇到,使用集合存儲已經遇到的數字,若是遇到的一個數字已經在集合中,則當前的數字是重複數字。leetcode時間複雜度:遍歷數組O(n),查詢hash表爲O(1),總體仍是爲O(n)get
空間複雜度:須要開闢一個數組暫存遍歷的數值,因此爲O(n)hash
func findRepeatNumber(nums []int) int { if nums == nil || len(nums)==0 { return -1 } mp := map[int]int{} for i,v := range nums{ if _,ok := mp[v];ok { //若是hash表中存在,代表出現了重複數值 return v } mp[v] = i } return -1 }
原地置換法
:若是沒有重複數字,那麼正常排序後,數字i應該在下標爲i的位置,因此思路是重頭掃描數組,遇到下標爲i的數字若是不是i的話,(假設爲m),那麼咱們就拿下標m對應的值與下標m對應的值做爲下標的值交換,即nums[m]與nums[nums[m]]交換。在交換過程當中,若是有重複的數字發生,那麼終止返回tureclass時間複雜度仍是O(n)遍歷
下降了空間複雜度,使空間複雜度從O(n) ——>O(1)map
func findRepeatNumber(nums []int) int { if nums == nil || len(nums)==0 { return -1 } for i:=0;i<len(nums);i++{ //下標與對應值不等 if i!=nums[i]{ if nums[i]==nums[nums[i]]{ //說明找到了重複的值 return nums[i] } } //交換 nums[i],nums[nums[i]] = nums[nums[i]],nums[i] } return -1 }