劍指offer題目 不修改陣列找出重複的數字

2021-09-14 07:38:21 字數 814 閱讀 9271

沒有在牛客網的oj上找到這個題目所以寫在部落格裡記錄一下

題目:在乙個長度為n+1的陣列裡的所有數字都在1~n的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。例如,如果輸入長度為8的陣列,那麼對應的輸出是重複的數字2或者3.

題目中說了不能改變輸入的陣列,那麼

方案一:可以建立乙個長度為n+1的輔助陣列,然後逐一把原陣列的每個數字複製到輔助陣列。如果原陣列被複製的數字為m,就把它放在輔助陣列的第m位(下標為m),很容易找出重複的數字。

方案二:找出1~n中間出現的數字m,將數字分為兩部分,一部分為1到m,另一部分為m+1到n,分別統計這兩部分的數字數目,如果第一部分的數字數目超過m,說明裡面肯定有重複的數字,否則另一半的區間一定包含重複的數字。接下來再把包含重複數字的區間一分為二,直到找到乙個重複的數字。

**如下:

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)

需要指出的是這種演算法不能保證找出所有重複的數字,但因為題目中說找出任意重複的即可,所以此方法可行。

劍指Offer 不修改陣列找出重複的數字

在乙個長度為n 1的陣列裡,所有的數字都在1 n的範圍內,所以陣列中至少有乙個數字是重複的 因為長度為n 1,而1 n只有n個數字,也就是說就算每個數字不一樣,都會空餘乙個位置,所以至少有乙個重複的數字 請找出陣列中任意乙個重複的數字,但是不能修改輸入的陣列。例如,如果輸入長度為8的陣列,那麼對應輸...

劍指offer 不修改陣列找出重複的數字go語言版

題目描述 給定乙個長度為n 1的陣列nums,陣列中所有的數均在1 n 的範圍內,其中 n 1。請找出陣列中任意乙個重複的數,但不能修改輸入的陣列。樣例給定 nums 2,3,5,4,3,2,6,7 返回 2 或 3。思考題 如果只能使用 o 1 的額外空間,該怎麼做呢?題目思路 該題目主要使用二分...

劍指 03 題目二 不修改陣列找出重複的數字

其他好的解法 測試用例 獲得的思考 在乙個長度為n 1的陣列裡的所有數字都在1 n範圍內,所以陣列中至少有乙個數字重複。找出乙個重複的數字但不能修改原陣列 示例 輸入 輸出 2或3本題是這道題的延伸,劍指 03 陣列中重複的數字 既然給出了陣列長度,第乙個念頭還是想到雜湊法,與上面題中 基本一致,需...