题目: 给定一个无序整型数组,找出第一个不在数组里的正整数.要求时间复杂度O(n),空间复杂度为O(l).
举例:
输入数组{5,3,-1,1},返回2
代码实现:
package main
import "fmt"
// 解法1,使用哈希思想,空间复杂度为O(n)
func hxqj(a []int) int {
m := make(map[int]bool)
for _, v := range a {
m[v] = true
}
for i := 1;i <= len(a) + 1;i += 1 {
_, e := m[i]
if e == false {
return i
}
}
return -1
}
// 解法2,使用数组,空间复杂度为O(n)
func szjq(a []int) int {
sz := make([]bool, 0)
l := len(a)
for i := l + 1;i >= 0;i -= 1 {
sz = append(sz, false)
}
for _, v := range a {
if l + 1 >= v {
sz[v] = true
}
}
l += 1
for i := 1;i <= l;i +=1 {
if sz[i] == false {
return i
}
}
return -1
}
// 解法3,空间复杂度O(1)
func jf3(a []int) int {
a = append(a, 0)
l := len(a)
for i := 0;i < l;i += 1 {
if a[i] > 0 && a[i] <= l {
if a[i] != a[a[i] - 1] && a[i] != i + 1 {
a[i], a[a[i] - 1] = a[a[i] - 1], a[i]
i -= 1
}
}
}
for i := 0;i < l;i += 1 {
if a[i] != i + 1 {
return i + 1
}
}
return -1
}
func main() {
a := []int{2,1,1,4}
fmt.Println(hxqj(a))
fmt.Println(szjq(a))
fmt.Println(jf3(a))
}