题目: 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例 :
输入: [0,1,3]
输出: 2
解题思路:
方法一:看到该题目我首先想到的就是将0~n-1加起来作为count1,将,将数组中的元素加起来作为count2,count1-count2的结果就是缺失的数字。
class Solution {
public int missingNumber(int[] nums) {
int count1 = 0);
int count2 = 0;
for(int i = 0;i <= nums.length;i++){
count1+=i;
}
for(int i = 0;i < nums.length;i++){
count2+=nums[i];
}
return count1-count2;
}
}
方法二:想到的第二个方法就双指针,遍历数组,相邻两个元素做差,当差不为1时说明缺失的数是该相邻元素之间的数。但是需要注意的是以下特殊情况,
class Solution {
public int missingNumber(int[] nums) {
for(int i = 0;i < nums.length-1;i++){
if(nums[i+1] - nums[i] != 1){
return i+1;
}
}
if(nums[0] != 0){
return 0;
}
return nums.length;
}
}
方法三:二分法查找;该思路是在力扣中看到的解法进行了理解;有序数组中搜索使用二分法。
class Solution {
public int missingNumber(int[] nums) {
int i = 0;
int j = nums.length-1; //左闭右闭区间[i,j]
while(i <= j){
int mid = (i+j)/2;
if(nums[mid] == mid){
//说明左半部分数据都是和索引相对应的,缺失情况不在左半部分
i= mid+1;
}else{
//缺失的元素在左半部分
j = mid-1;
}
}
return i;
}
}