leetCode算法-268(缺失數字)

給定一個包含 0, 1, 2, ..., n 中 n 個數的序列,找出 0 .. n 中沒有出如今序列中的那個數。數組

示例 1:翻譯

輸入: [3,0,1]
輸出: 2
示例 2:code

輸入: [9,6,4,2,3,5,7,0,1]
輸出: 8索引

下面我用兩種方法,一塊瞭解一下。數學

求合法

// 開始以前我先說一下個人思路
        //0-n個有序數字累加和,數學裏邊是有公式的,咱們重溫一下推導過程。
        // 0, 1          n爲1 個數爲2, 累加和爲1
        // 0, 1, 2       n爲2 個數爲3,累加和爲3
        // 0, 1, 2, 3    n爲3 個數爲4,累加和爲6
        // 0, 1, 2, 3 ,4 n爲4 個數爲5, 累加和爲10

        // 思考一下,n已知因此咱們從n上找規律

        //以上咱們推出 (n*個數)/2 = 累加和,是否是這個理?

        // n知道 累加和知道,少那個咱們不就知道了嗎?

        // 完整的n序列和-缺失數字的累加和=缺失數字

        // 翻譯成代碼
        var arr = [0, 1, 3]

        function findNum(nums) {
            let len = nums.length
            let n = len * (len + 1) / 2
            let n1 = nums.reduce((num, item) => {
                return num + item
            }, 0)
            console.log(n, n1)
            return n - n1
        };

        console.log(findNum(arr))//2

索引查找法

//先解析思路,0-n序列,數組的索引和0-n序列正好能一一對應,不過由於有多是亂序,因此不能直接挨個匹配索引對比,咱們須要換個思路。
//由於是序列,雖然亂序,只是和遍歷n的索引值缺一個,這就簡單了,咱們經過遍歷n來查找對應的剩餘數組,找不到的就是咱們要找的缺失數字,怎麼找對應數字呢?你猜對了咱們用indexOf()
          function findNum1(nums) {
            let len = nums.length + 1
            for (let i = 0; i < len; i++) {
                if (nums.indexOf(i) === -1) {
                    return i
                }
            }
        };
        findNum1(arr)

完美,只不過沒有第一種的效率高!畢竟每一次indexOf也是一次遍歷過程。it

相關文章
相關標籤/搜索