leetcode面試題53 - II.(0~n-1中缺失的數字)--C語言實現

求:數組

一個長度爲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;
}
相關文章
相關標籤/搜索