剑指 Offer 53 - II. 0~n-1中缺失的数字
题解:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,即一个长度为n-1数组中的元素都在[0,n-1]这个范围内,且顺序递增,所以数组中肯定会缺失 一个属于[0,n-1]的数,我们就是要找出这个数。
解法:
方法一:
双重for循环,因为这个数组是从0开始的,所以我们可以直接用i来和数组中的数进行比较。
而代码中的j、n是起验证作用,当我们每用i比较一次数组中所有的元素,如果有相同的数,n就会加一,如果没有n就不会变,此时我们再用n和j比较,如果n=j,就是此时的 i 在数组中没有出现,所以返回 i。如果 n!=j,则 j++ 来确保下一轮循环的准确性。循环外的return 0;是为了保证代码的正确性,无关程序正误。
class Solution {
public int missingNumber(int[] nums) {
int size = nums.length;
for (int i = 0;i <=size;i++){
int j = 0;
int n = j;
for (int num : nums){
if (i == num){
n++;
}
}
if (n == j){
return i;
}else {
j++;
}
}
return 0;
}
}
方法二:(官方)
核心思想就是因为数组递增,所以如果中间没有缺失,则下表和数组元素一一对应,如果确实下标一定小于数组元素。所以应用二分法的原理可以进行查找。
class Solution {
public int missingNumber(int[] nums) {
int i = 0, j = nums.length - 1;
while(i <= j) {
int m = (i + j) / 2;
if(nums[m] == m) i = m + 1;
else j = m - 1;
}
return i;
}
}