Leetcode专题[数组]-268-丢失的数字

力扣链接:https://leetcode-cn.com/probl...
解题思路:

  1. 还是老套路,看题干,找线索,首先题干给的是包含[0,n]的数字数组,找出[0,n]中没有出现在数组中的数字。那么如果[0,n]中所有的数字全部都在,就一定是形如[0,1,2,3,4...,n-1,n]这样的相邻递增数字
  2. 找规律:在这样的数字中,首先对其进行排序,排序后下标和数字是相等的,那么首先就可以对数组进行遍历,如果遍历到某个下标,数字跟它不相等,则该数字不存在
func missingNumber(nums []int) int {
    for i, v := range nums {
        if i != v {
            return i
        }
    }
    return len(nums)
}

3.上面的思路可以进一步延伸,使用哈希表进行优化,首先将每个数组中的数字以数字为KEY,TRUE为value进行标记,然后进行一个从0~上限的遍历,m[i]为false时则这个数字是缺失的

func missingNumber(nums []int) int {
    numToBool := make(map[int]bool, len(nums))
    for i := 0; i < len(nums); i++ {
        numToBool[nums[i]] = true
    }
    for i := 0; ; i++ {
        if !numToBool[i] {
            return i
        }
    }
    return len(nums)
}

4.最精妙的解法,害得是数学!从小我们就知道高斯这个数学小王子,得出了从0~n的整数和的公式:sum = n * (n + 1) / 2;那么从0到n的数字,缺失的就是应该有的数减去数组之和:

func missingNumber(nums []int) int {
    n := len(nums)
    total := n * (n + 1) / 2
    sum := 0
    for i := 0; i < n; i++ {
        sum += nums[i]
    }
    return total - sum
}

你可能感兴趣的:(golang)