例如2,3,4,5,6,8,9.在这个数组中我们要找到缺少的7。从直觉上看,我们可以把2到9求和,然后把数组的成员求和。用数字的和减去数组的和得到的就是缺少的数字。但是这个办法的时间复杂度是O(n)。但是我们看到数组是有序的,能不能通过二分法找到数字呢,答案是肯定的。我们可以发现规律,如果数字缺少在数组的前半部分,那么数组的中间节点会大于数字的中间节点。例如1,3,4由于缺少2,所以数组的中间节点变成了3,但是数字的中间节点仍然是2。如果缺少的数字在后半部分,则数组中间节点等于数字的中间节点。通过这个规律,我们可以通过二分法找到缺少的数字的准确位置。
int FindMissedNumber(int* list, int start, int end)
{
if(list[end - start - 1] < end)
{
return end;
}
if(end - start == 1)
{
if(list[0] == start)
{
return end;
}
else
{
return start;
}
}
if(list[(end - start )/ 2] > (end - start) / 2+ start)
{
return FindMissedNumber(list, start, (end - start) / 2 + start);
}
else
{
return FindMissedNumber(list + (end -start)/ 2 + 1, (end-start ) /2 + 1 + start, end);
}
}