1. 程式人生 > 實用技巧 >劍指Offer_53 - II_0~n-1中缺失的數字

劍指Offer_53 - II_0~n-1中缺失的數字

劍指Offer_53 - II_0~n-1中缺失的數字

劍指offer

Contents

題目

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

思路分析

二分查詢。

  • 如果缺失的數字不是陣列的第一個或者最後一個,那麼比較好處理,可以直接在陣列中定位到這個位置,然後將此位置的下標返回;
  • 如果缺失的是第一個數字0,那麼應該返回0;
  • 如果缺失的是最後一個數字,應該返回n-1(這時已經超出下標範圍,最後一個下標是n-2)。所以如果我們用mid作為返回值,對這種情況就無能為力,因為mid不會超出陣列下標範圍。
    • 這裡的處理方法和上題劍指Offer_53 - I_在排序陣列中查詢數字 有些類似,為了尋找右邊界,不使用mid作為定位的結果,而是使用左指標start作為定位結果。這樣一來,如果缺失的數字是最後一個,也能得到正確結果,而不需要做任何特殊的處理。

解答

class Solution {
    public int missingNumber(int[] nums)
{ int start = 0; int end = nums.length - 1; while(start <= end){ int mid = start + (end - start) / 2; if(nums[mid] == mid) start = mid + 1; if(nums[mid] != mid) end = mid - 1; } //這樣寫的好處是考慮到了省略數字在頭尾的情況 return start; } }