一、题目描述:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例 1:
输入: [0,1,3]
输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8
二、思路分析:
- 最容易想到的思路,遍历数组,比较当前值和前一个值的差值,大于1的说明缺了一个数。没找到的说明缺少的是最后一个。数字范围从0~n,所以前驱数字从-1开始
- 数字范围从0~n,所以也可以直接比较数组的
index和num[index],不一致的就是想要找的数字,如果遍历完没找到,说明该数字是最后一个 有序数组搜索,首先想到二分搜索,利用上2中index和num[index]的关系,用折半的方式查找
三、AC 代码:
class Solution {
fun missingNumber(nums: IntArray): Int {
return solution3(nums)
}
fun solution3(nums:IntArray):Int{
var l = 0
var r = nums.size-1
while(l<=r){
var middle = (l+r)/2
if(nums[middle]==middle){
l = middle+1
}else{
r = middle-1
}
}
return l
}
fun solution2(nums:IntArray):Int{
var n = nums.size
for(i in 0 .. n-1){
if(nums[i]!=i){
return i
}
}
return n
}
fun solution1(nums:IntArray):Int{
var pre = -1
for(i in 0 .. nums.size-1){
var current= nums[i]
if(current-pre>1){
return pre+1
}else{
pre = current
}
}
return pre+1
}
}
四、总结:
有序数组搜索,首先想到二分搜索