力扣链接: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
}
发表回复