关于golang: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
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理