关于golang:Leetcode专题数组268丢失的数字

39次阅读

共计 773 个字符,预计需要花费 2 分钟才能阅读完成。

力扣链接: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
}

正文完
 0