私の最初のアイデアは、midとstartとendの違いで欠落している数かどうかを判断することでしたが、答えは、0との2つを避けて、配列の添え字のサイズと配列の値が同じかどうかを直接判断することです。長さ-1位置要素の判断の違いによる問題
私のエラーコード
public int missingNumber(int[] nums) {
int res = 0;
if(nums.length>1){
res = findMiss(nums,0,nums.length-1);
}else{
res = nums[0];
}
return res;
}
public int findMiss(int[] nums,int start,int end){
int res = 0;
if(start > end){
return -1;
}
int mid = (start + end)/2;
if(mid >0&&nums[mid] - nums[mid - 1] ==2){
return nums[mid] - 1;
}else if(mid<nums.length-1&&nums[mid + 1] - nums[mid] ==2){
return nums[mid] + 1;
}
if(mid >0&&mid - 1 - start != nums[mid-1] - nums[start]&&start<mid){
res = findMiss(nums,start,mid-1);
}else if(mid<nums.length-1&&end - mid -1 != nums[end] - nums[mid+1]&&end>mid){
res = findMiss(nums,mid+1,end);
}
return res;
}
私は答えに従ってアイデアを実装しました
public int missingNumber(int[] nums) {
int res = 0;
int left = 0;
int right = nums.length - 1;
while(left <=right){
int mid = (left + right)/2;
if(nums[mid] == mid){
if(mid + 1 >=nums.length){
res = mid + 1;
break;
}else{
left = mid + 1;
}
}else{
if(mid >0 && nums[mid - 1] == mid - 1){
res = nums[mid] - 1;
break;
}else if(mid >0 && nums[mid - 1] != mid - 1){
right = mid - 1;
}else if(mid == 0){
res = 0;
break;
}
}
}
return res;
}
回答コード
public int missingNumber(int[] nums) {
int res = 0;
int left = 0;
int right = nums.length - 1;
int length = right + 1;
while(left <=right){
int mid = (right + left) >> 1;
if(nums[mid] != mid){
if(mid == 0||nums[mid - 1] == mid - 1)
return mid;
right = mid - 1;
}else{
left = mid + 1;
}
}
if(left == length)
return length;
return -1;
}