在有序遞增陣列中查詢一個缺少的數字
阿新 • • 發佈:2019-01-26
例如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); } }