力扣链接:https://leetcode-cn.com/probl...
解题思路:
- 还是老套路,看题干,找线索,首先题干给的是包含[0,n]的数字数组,找出[0,n]中没有出现在数组中的数字。那么如果[0,n]中所有的数字全部都在,就一定是形如[0,1,2,3,4...,n-1,n]这样的相邻递增数字
- 找规律:在这样的数字中,首先对其进行排序,排序后下标和数字是相等的,那么首先就可以对数组进行遍历,如果遍历到某个下标,数字跟它不相等,则该数字不存在
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
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。