在有序递增数组中查找一个缺少的数字

来源:互联网 发布:六度空间理论算法 编辑:程序博客网 时间:2024/04/30 01:55

例如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);}}