首先暴力解法思路非常简单:如果不缺失,那么数组的索引和其对应元素的值是相同的。如果不相同,则输出索引值。
注意,如果数组里面不缺失数字,则需要输出数组的下一个索引值,即nums.length。比如针对数组[0],[0,1]...
public int missingNumber(int[] nums) {
//限制条件
if(nums.length == 0 || nums.length > 10000){
return -1;
}
//遍历数组,以索引值递增的形式
for(int i = 0; i < nums.length; i++){
if(i != nums[i]){
return i;
}
}
//针对[0],[0,1],[0,1,2]...的情况
return nums.length;
}
排好序的数组可以用二分法进行求解。https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/solution/mian-shi-ti-53-ii-0n-1zhong-que-shi-de-shu-zi-er-f/
public int missingNumber(int[] nums) {
//定义左右边界
int left = 0;
int right = nums.length - 1;
while(left <= right){
int middle = (left + right) / 2;
//如果nums[middle] == middle,只能是右边出现缺失数字
if(nums[middle] == middle){
left = middle + 1;
}
if(nums[middle] > middle){
right = middle - 1;
}
}
return left; //输出的是右子数组的首个元素
}