1. 程式人生 > >在有序遞增陣列中查詢一個缺少的數字

在有序遞增陣列中查詢一個缺少的數字

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