劍指 Offer 03. 數組中重複的數字

劍指 Offer 03. 數組中重複的數字

找出數組中重複的數字。數組

在一個長度爲 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
}
相關文章
相關標籤/搜索