題目二:
在乙個長度為n+1的陣列裡的所有數字都在1-n的範圍裡,所有陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。
方法一:
優於題目要求不能修改輸入的陣列,我們可以建立乙個長度為n+1的輔助陣列,然後逐一把原陣列的每個數字複製到輔助陣列。如果原陣列中被複製的數字是m,則把它複製到輔助陣列中下標為m的位置。這樣很容易就能發現那個數字是重複的。由於需要建立乙個陣列,該方案需要o(n)的輔助空間。
方法二:
我們把從1-n的數字從中間的數字m分為兩部分,前面一半為1-m,後面一半為m+1-n.如果1-m的數字的數目超過了m,那麼這一版的區間一定包含重複的數字;否則,另一半m+1-n的區間裡一定包含重複的數字。我們可以繼續把包含重複數字的區間一分為二,直到找到乙個重複的數字。這個過程和二分查詢演算法很類似,只是多了一步統計區間裡數字的數目。
int getduplication(const int* numbers, int length)
if(count > (middle - start + 1))
end = middle;
else
start = middle + 1;
}return -1;
}int countrange(const int* numbers, int length, int start, int end)
{if(numbers == nullptr)
return 0;
int count = 0;
for(int i = 0; i < length; i++)
if(numbers[i] >= start && numbers[i] <= end)
++count;
return count;
上述**按照二分查詢的思路,如果輸入長度為n的陣列,那麼函式countrange將被呼叫o(logn)次,每次需要o(n)的時間,因此總的時間複雜度為o(nlogn),空間複雜度為o(1)。
需要指出的是,這種演算法不能保證找出所有重複的數字。
不修改陣列找出重複的數字
在乙個長度為n 1的陣列裡的所有數字都在 1 n 的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。例如,如果輸入長度為 8 的陣列 那麼對應的輸出是重複的數字 2 或者 3。這道題目可以把 1 n 數字從中間的數字 m 分為兩部分,前面一半為 1 m...
不修改陣列找出重複的數字
給定乙個長度為 n 1 的陣列nums,陣列中所有的數均在 1 n 的範圍內,其中 n 1。請找出陣列中任意乙個重複的數,但不能修改輸入的陣列。樣例給定 nums 2 3,5 4,3 2,6 7 返回 2 或 3。思考題 如果只能使用 o 1 的額外空間,該怎麼做呢?暴力做法在此不做敘述,這裡講述空...
陣列 不修改陣列找出重複的數字
不修改陣列找出重複的數字 題目 在乙個長度為n 1的陣列裡的所有數字都在1到n的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的 陣列。例如,如果輸入長度為8的陣列,那麼對應的輸出是重複的數字2或者3。方法 我們把從1 n的數字從中間的數字m分為兩部分,前面...