題目一:找出陣列中重複地數字。
在乙個長度為n的陣列裡的所有數字都在0-n-1的範圍裡。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2和這3.
方法一:
解決這個問題的乙個簡單的方法是先把輸入的陣列排序。從排序的陣列中找出重複的數字是一件很容易的事情,只需要從頭到尾掃瞄排序後的陣列就可以了。排序乙個長度為n的陣列需要o(nlogn)的時間。
方法二:
還可以利用雜湊表來解決這個問題。從頭到尾按順序掃瞄陣列的每個數字,每掃瞄到乙個數字的時候,都可以用o(1)的時間來判斷雜湊表裡是否已經包含了該數字。如果雜湊表裡還沒有這個數字,就把它加入雜湊表。如果雜湊表裡已經存在了該數字,就找到乙個重複的數字。這個演算法的時間複雜度是o(n),但它提高時間效率是以乙個大小為o(n)的雜湊表為代價的。
方法三:
我們注意到陣列中的數字都在0-n-1的範圍內。如果這個陣列中沒有重複的數字,那麼當陣列排序之後數字i將出現在下標為i的位置。由於陣列中有重複地數字,有些位置可能存在多個數字,同時有些位置可能沒有數字。
從頭到尾依次掃瞄這個陣列中的每個數字。當掃瞄到下表為i的數字時,首先比較這個數字(m)是不是等於i。如果是,則接著掃瞄下乙個數字,;如果不是,則再拿它和第m個數字進行比較,如果它和第m數字相等,就找到了乙個重複的數字;如果它和第m個數字不相等,就把第i個數字和第m個數字交換,把m放到屬於它的位置。接下來在重複這個比較、交換的過程,直到我們發現乙個重複的數字。
bool duplicate(int numbers, int length, int* duplication)
for (int i = 0; i < length; ++i)
int temp = numbers[i];
numbers[i] = numbers[temp];
numbers[temp] = temp;}}
return false;
儘管**中有乙個兩重迴圈,但每個數字最多只要交換兩次就能找到屬於它的位置,因此總的時間複雜度是o(n)。另外,所有的操作步驟都是在輸入陣列上進行的,不需要額外分配記憶體,因此空間複雜度為o(1)。
陣列 陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。思路 python 實現 an highlighted block ...
陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道哪幾個 數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如 如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。include iostream using namespace ...
陣列中重複的數字
題目 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。思路 用雜湊表解決的時間複雜度和空間複雜度為o n 因為陣列中...