找到所有數組中消失的數字
題目描述
給定一個范圍在 1 ≤ a[i] ≤ n ( n = 數組大小 ) 的 整型數組,數組中的元素一些出現了兩次,另一些只出現一次。
找到所有在 [1, n] 范圍之間沒有出現在數組中的數字。
您能在不使用額外空間且時間復雜度為O(n)的情況下完成這個任務嗎? 你可以假定返回的數組不算在額外空間內。
示例 1:
輸入:
[4,3,2,7,8,2,3,1]
輸出:
[5,6]
解法
方法1、若按序不重復存放,則 n 個元素剛好存放于大小為 n 的數組中,即每個下標 i 處存放元素值為 i+1。
根據題目中描述,數組中可能存在重復元素,且并未按序存放。所以不妨遍歷數組,將每個元素調整到對應下標的位置,即將元素 k 存儲于下標為 k-1 處。然后遍歷數組,元素值與下標不匹配的即為消失元素數字。
方法2、先排序,再根據排序結果找出缺失的數字
package main
import "fmt"
func parse(a []int, begin int, end int) int {
index := a[begin]
for begin < end {
for begin < end && a[end] >= index {
end--
}
a[begin] = a[end]
for begin < end && a[begin] <= index {
begin++
}
a[end] = a[begin]
}
a[begin] = index
return begin
}
func quick_sort(a []int, begin int, end int) {
if begin < end {
flag := parse(a, begin, end)
quick_sort(a, begin, flag-1)
quick_sort(a, flag+1, end)
}
}
func FindMissingNum2(num []int) (result []int){
quick_sort(num, 0, len(num)-1)
fmt.Println(num)
compare := 1
for j := 0; j < len(num); j++ {
if num[j] > compare {
for k := compare; k < num[j]; k++ {
result = append(result, k)
}
compare = num[j] + 1
} else if num[j] == compare {
compare++
}
}
if compare <= len(num) {
for i := compare; i <= len(num); i++ {
result = append(result, i)
}
}
fmt.Println(result)
return result
}
func FindMissingNum1(num []int) (result []int){
for i := 0; i < len(num); i++ {
c := num[i]
for num[c-1] != c {
temp := num[c-1]
num[c-1] = c
c = temp
}
}
fmt.Println(num)
for j := 0; j < len(num); j++ {
if num[j] != j +1 {
result = append(result, j+1)
}
}
fmt.Println(result)
return result
}
func main() {
num := []int{4,3,2,7,8,2,2,3,1,1,4}
fmt.Println(FindMissingNum1(num))
num = []int{4,3,2,7,8,2,2,3,1,1,4}
fmt.Println(FindMissingNum2(num))
}
運行結果:
GOPATH=F:\goPath #gosetup
C:\Go\bin\go.exe build -o C:\Users\windows10\AppData\Local\Temp\___go_build_FindMissingNum_go.exe F:/code/test/FindMissingNum/FindMissingNum.go #gosetup
C:\Users\windows10\AppData\Local\Temp\___go_build_FindMissingNum_go.exe #gosetup
[1 2 3 4 8 2 7 8 1 1 4]
[5 6 9 10 11]
[5 6 9 10 11]
[1 1 2 2 2 3 3 4 4 7 8]
[5 6 9 10 11]
[5 6 9 10 11]
Process finished with exit code 0