1. 程式人生 > 其它 >大二上學期期末總結

大二上學期期末總結

這個題當然可以用遍歷的方法,但是我們只要看到遞增排序陣列,就應該想到用二分法去做。但是這個題跟其它的二分法不是很一樣,它沒有明確要查詢的target 或者左邊界,右邊界等,而是陣列的中間有一個斷點。我們可以根據這個斷點把陣列分為兩部分:左陣列和右陣列,然後我們可以發現,左陣列的所有元素的值都和他們的索引相同,而右陣列則不是

  因此,我們可以用 值是否與索引相同這一點來判斷是左陣列還是右陣列。而根據題目要求,我們需要返回右陣列的第一個元素的索引,它就是缺失的元素

 那麼,我們使用二分查詢,最終 left 應該對應的 右陣列的第一個元素,而 right 應該對應左陣列的最後一個元素,即 left == right + 1時退出。

class Solution {
    public int missingNumber(int[] nums) {
        //嘗試二分法
        int left = 0,right = nums.length-1,mid;
        //可以跟索引進行對應
        while(left<=right){ //當 left == right+1 時退出
            mid = left + (right - left)/2;
            if(nums[mid]==mid){
                //mid在左陣列,右陣列第一個元素在[mid+1,right]上
left = mid + 1; }else{ //mid在右陣列,左陣列的最後一個元素在[left,mid-1]上 right = mid - 1; } //不存在 nums[mid]>mid的情況 } return left; //left對應 右陣列的第一個元素 } }