leetCode算法-268(缺失數字)

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

示例 1:

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

輸入: [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也是一次遍歷過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章