在乙個長度為 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 初次思考 題目給了陣列的數的範...