大二上學期期末總結
阿新 • • 發佈:2021-12-24
這個題當然可以用遍歷的方法,但是我們只要看到遞增排序陣列,就應該想到用二分法去做。但是這個題跟其它的二分法不是很一樣,它沒有明確要查詢的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對應 右陣列的第一個元素 } }