一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
解题思路
- 看到有序数组,首先想到二分法
- 分析题目,实际要我们找的就是不等于对应值的第一个索引的值,即 nums[mid] != mid
- 所以可以直接用二分法
- 如果 nums[mid] == mid ,low指针右移
- 如果 nums[mid] != mid , high指针左移
- 最后low指针的值,就是我们要找的
代码
class Solution {
public int missingNumber(int[] nums) {
int low = 0;
int high = nums.length - 1;
int mid = 0;
while (low <= high) {
mid = (low + high) / 2;
if (nums[mid] == mid) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return low;
}
}
二分法的一个特性的总结:
如无别的跳出条件,low、high指针,最后一定会位于符合两个条件的交界处,而mid指针由于int类型的特性,往往会指向和low指针同一个节点,此时,再根据具体的条件来判断low、mid、high指针接下来的移动,可以更容易地来确定退出时,它们分别指向哪个节点。