1. 程式人生 > 其它 >【已解決】pip cookielib失敗

【已解決】pip cookielib失敗

技術標籤:演算法leetcode資料結構演算法

故心故心故心故心小故衝啊


文章目錄


題目:一個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0~n-1之內。在範圍0~n-1內的n個數字中有且只有一個數字不在該陣列中,請找出這個數字。

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

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

解法一:遍歷迴圈判斷

簡單明瞭,遍歷一遍陣列,當陣列元素的值不等於對應下標的時候,return 下標值.
特殊情況說明:當陣列為[0, 1]預設的是最後一個元素時會有問題,所以遍歷的時候需要遍歷到陣列的長度下標

var missingNumber = function(nums) {
    for(let i = 0 ; i <= nums.length ; i++){
    
        if(nums[i]!== i)
        return i
    }
};

在這裡插入圖片描述

解法二:二分查詢

利用二分查詢,整體流程是:

left 指向 0,right 指向最後一個元素
計算中間座標 mid:
如果mid = nums[mid],說明[0, mid]範圍內不缺失數字,left 更新為 mid + 1

如果mid < nums[mid],說明[mid, right]範圍內不缺失數字,right 更新為 mid - 1
檢查 left 是否小於等於 mid,若成立,返回第 2 步;否則,向下執行
返回 left 即可
注意,根據題意,可以知道mid > nums[mid]這種情況不存在。

例如[0,2,3,4,5,6,7,8,9,10]
left = 0 mid = 5 right=10
第一輪迴圈 0 <=10 mid === nums[mid] ? 5 => < 6 right = 5-1 = 4
left = 0 mid =2 right =4
第二輪迴圈 0<=4 mid === nums[mid] ? 2<3 => right = 2-1=1

left = 0 mid = 0 right = 1
第三輪迴圈 0<=1 mid = === nums[mid] ? 0 ===0 => left = 1

var missingNumber = function(nums) {
    let left = 0,
        right = nums.length - 1;
    while (left <= right) {
        let mid = Math.floor((left + right) / 2);
        if (mid === nums[mid]) {
            left = mid + 1;
        } else if (mid < nums[mid]) {
            right = mid - 1;
        }
    }

    return left;
};

在這裡插入圖片描述