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
}
posted @ 2021-01-30 20:31  童年の波鞋  阅读(97)  评论(0编辑  收藏  举报