蘋果確認 Studio Display 將適用於 PC,但有一些地方需要注意
阿新 • • 發佈:2022-03-11
一個長度為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; } }