求:數組
一個長度爲n-1的遞增排序數組中的全部數字都是惟一的,而且每一個數字都在範圍0~n-1以內。在範圍0~n-1內的n個數字中有且只有一個數字不在該數組中,請找出這個數字。優化
示例 1:spa
輸入: [0,1,3]
輸出: 2
示例 2:code
輸入: [0,1,2,3,4,5,6,7,9]
輸出: 8
排序
限制:索引
1 <= 數組長度 <= 10000leetcode
解:di
思路:很天然想到,題目所給的是一個從[0,n-1]的等差級數,若是每個數字都出現了,則等差級數的和是n*(n-1)/2,所以咱們計算當前和,並返回n*(n-1)/2和當前的和的差值,即爲缺失的數。while
int
missingNumber(
int
* nums,
int
numsSize){
int
i;
int
sum =
0
;
for
(i=
0
;i<numsSize;i++) sum += nums[i];
return
(numsSize+
1
)*numsSize/
2
- sum;
}
可是這裏還有更優的解法,觀察到題目給定的條件:有序遞增的排序數組,所以很容易想到二分法。咱們使用二分法進一步優化結果:
根據觀察能夠發現,咱們將數組分爲2部分(左右數組),對左數組中的每個數,有nums[i]=i(對應索引上都有一個和索引值相等的數)。對右數組,由於有元素缺失,第一個索引不等於值的位置就是咱們要找的數,所以二分結束後,返回相應位置的索引便可。具體能夠參考leetcode官方題解。
int
missingNumber(
int
* nums,
int
numsSize){
int
low =
0
;
int
high = numsSize-
1
;
int
mid;
while
(low<=high){
mid = (low+high)>>
1
;
if
(nums[mid]>mid) high = mid-
1
;
else
low = mid+
1
;
}
return
low;
}