a_lc_缺失的第一个整数 I~II(暴力 / 不断放到正确位置)
I
O(n),差在没有利用有序的条件
func missingNumber(A []int) int {
n := len(A)
for i := 0; i < n; i++ {
for (A[i]>=0 && A[i]<n && A[A[i]] != A[i]) {
A[A[i]], A[i] = A[i], A[A[i]]
}
}
for i := 0; i < n; i++ {
if (i != A[i]) {
return i
}
}
return n
}
O(logn)
func missingNumber(A []int) int {
n := len(A)
l, r := 0, n-1
for (l < r) {
m := (l+r)/2
if (A[m] != m) {
r = m
} else {
l = m + 1 //A[m]=m,证明[0..m]这一段都是连续的
}
}
if (l == n-1 && A[l] == l) { //特判[0,1,2]这种,应返回3
return l+1
}
return l
}
II
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。O(n)+O(1)
排序
func firstMissingPositive(A []int) int {
n := len(A)
sort.Ints(A)
for i := 1; i <= n; i++ {
idx := sort.SearchInts(A, i) //返回理想的插入位置
if (idx >= n || A[idx] != i) {
return i
}
}
return n+1
}
O(n)
func firstMissingPositive(A []int) int {
n := len(A)
for i := 0; i < n; i++ {
for (0<A[i] && A[i]<=n && A[i]!=A[A[i]-1]) { //只要A[i]没在合法位置,我就一直将A[i]交换到A[A[i]-1]上,除非A[i]不合法
A[A[i]-1], A[i] = A[i], A[A[i]-1]
}
}
for i := 0; i < n; i++ {
if (i+1 != A[i]) {
return i+1
}
}
return n+1
}