1. 程式人生 > 資訊 >蘋果確認 Studio Display 將適用於 PC,但有一些地方需要注意

蘋果確認 Studio Display 將適用於 PC,但有一些地方需要注意

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

解法一:
二分設定left=0,right=nums.length-1,以及mid。
如果(left,mid]之間有缺失數字,則有
nums[mid]-nums[left] != mid - left;
則令right=mid(因為此時的mid仍有可能是缺失數字後的第一位)

如果(left,mid]之間沒有,則說明缺失數字在(mid, right],
則令left=mid(因為此時的mid不可能是缺失數字後的第一位)

接下來確定while()的內容。我們想要的是情況是(左,右], 左是正常,右是缺失後的一位。故設定while內容 left+1<right
返回內容是nums[right]=right+1,故缺失數字為right。

但是這個思路有bug,即當缺失數字為0和n時,不能夠確定。所以需要提前判斷。

總的程式碼為:

class Solution {
    public int missingNumber(int[] nums) {
        int left = 0;
        int right = nums.length-1;
        if(nums[0]!=0) return 0;
        if(nums[right]!=right+1) return right+1;

        while(left+1<right){
            int middle = left + (right-left)/2;
            if(nums[middle]-nums[left] == middle-left){
                left = middle;
            }else{
                right=middle;
            }
        }
        return right;
    }
}

思路2:
如果沒有缺失數字,則有nums[i]=i;故題目的目的就是找出第一個nums[i]!=i的數字。
設定left=0,right=nums.length;
有效區間為[left, right]
如果有nums[mid]=mid,則說明[left,mid]段內ok,錯誤在(mid,right]內,令left = mid + 1;
否則,說明[left, mid]內不ok,令right = mid
定義left<right
返回right

class Solution {
    public int missingNumber(int[] nums) {
        int left = 0;
        int right = nums.length;
        while(left<right){
            int mid = left + (right-left) / 2;
            if(nums[mid]==mid){
                left = mid + 1;
            }else{
                right = mid;
            }
        }
        return right;
    }
}