劍指offer03 陣列中重複的數字

2021-09-19 13:51:20 字數 1523 閱讀 3661

在乙個長度為 n 的陣列 nums 裡的所有數字都在 0~n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。

示例 1:

輸入:

[2, 3, 1, 0, 2, 5, 3]

輸出:2 或 3

限制:

2 <= n <= 100000

首先拿到這道題最先想到的是用 map 處理,遍歷整個陣列,當某個數字在 map 中的 value 為 true 時,表示之前已經出現過這個數字。

但是如果在面試時面試官要求空間複雜度為 o(1) 時,就不能用額外的標記陣列或者 map。對於這種陣列元素在 [0, n-1] 範圍內的問題,我們可以通過原地置換法把將值為 i 的數置換到下標為 i 的位置。如果下標 i 之前已經有對應值為 i 的數字,就說明數字 i 重複。

用題目中給的例子來模擬該過程:

0 1 2 3 4 5 6 下標

2 3 1 0 2 5 3 初始值

1 3 2 0 2 5 3 下標0的2和下標2的1置換

3 1 2 0 2 5 3 下標0的1和下標1的3置換

0 1 2 3 2 5 3 下標0的3和下標3的0置換

0 1 2 3 2 5 3 下標2的值已經為2,下標4上的2不能與其置換,故2為重複數字

package main

import

"fmt"

func

main()

fmt.

println

(findrepeatnumber

(nums)

) fmt.

println

(findrepeatnumber2

(nums))}

func

findrepeatnumber

(nums [

]int

)int

m[num]

=true

}return0}

// 原地置換法

func

findrepeatnumber2

(nums [

]int

)int

nums[i]

, num = num, nums[i]}}

return

0}

#include

#include

using namespace std;

bool duplicate

(int numbers,

int length,

int*duplication)

;for

(int i =

0; i < length; i++

) b[numbers[i]

]= true;

}return false;

}int

main()

劍指Offer03 陣列中重複的數字

劍指offer典型題整理 爭取做最好的題解 題目描述 在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 輸入 2,3,1,0,2,5,3 輸出 2 或 3 限...

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

找出陣列中重複的數字。在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 1 輸入 2,3,1,0,2,5,3 輸出 2 或 3 限制 2 n 100000 首...

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

題目連線 找出陣列中重複的數字。在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。輸入 2,3,1,0,2,5,3 輸出 2 或 3 初次思考 題目給了陣列的數的範...