每日一練(25): 0~n-1中缺失的數字

加班猿發表於2022-03-02

title: 每日一練(25): 0~n-1中缺失的數字

categories:[劍指offer]

tags:[每日一練]

date: 2022/02/24


每日一練(25): 0~n-1中缺失的數字

一個長度為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

限制:

1 <= 陣列長度 <= 10000

來源:力扣(LeetCode)

連結:https://leetcode-cn.com/probl...

方法一:二分查詢

二分求邊界,其實就是求陣列中等於target的元素的範圍邊界,如果陣列中不存在等於target的元素,那求得的左右邊界的值就是一樣的。

int missingNumber(vector<int>& nums) {
    int l = 0;
    int r = nums.size();
    int m = 0;
    while (l < r) {        //二分查詢
        m = (l + r) / 2;
        if (nums[m] == m) {
            l = m + 1;
        } else {
            r = m;    //得到缺失的那個數
        }
    }
    return r;
}

方法二:數學法(等差數列)

陣列有n個數,但0到n有n+1個數,根據等差數列求和可得sum = (0+n)*(n+1)/2
然後總和減去陣列所有數,就是缺失的那個數

int missingNumber(vector<int>& nums) {
    int n = nums.size();
    int sum = (0 + n)*(n + 1) / 2;    //等差數列求和
    for (int i : nums) {
        sum -= i;    //總和減去陣列所有數,就是缺失的那個數
    }
    return sum;
}

相關文章