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;
}