陣列中重複的數字

2021-09-23 06:02:18 字數 1529 閱讀 6647

在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。 例如,如果輸入長度為7的陣列,那麼對應的輸出的重複的數字為2或3。

分析:

1. 用排序,但是最快的排序也要nlog(n),可不可以 o(1)

2. 用雜湊,但是需要o(n)的輔助空間,可不可以 不借助輔助空間

3. 因為數字的區間為0~n-1,如果沒有重複的數字,那麼陣列在排序後數字 k 將出現在 k 下標處,這樣的話如果乙個位置有多個數字則證明有重複陣列;

實現思路:當掃瞄到下標 k時,首先比較該位置上的數字 m是否等於k,如果是,則掃瞄下乙個數字;如果不是,則用數字m和下標為 m的處的數字比較。如果相等,則找到了乙個重複數字(因為數字m在k下標和m下標都出現過);如果不相等,則將k 和 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[i] = numbers[numbers[i]]

numbers[temp] = temp; //numbers[numbers[i]] = temp}}

}

不修改陣列的情況下找出重複的數字

有乙個長度為 n+1 的陣列裡的所有數字都在1~n的範圍內,所以陣列中至少有乙個數字是重複的。請找出任意乙個重複的數字,但是不能修改陣列。

分析:

1. 輔助陣列,來統計,但是需要o(n)的輔助空間

2. 長度為 n+1 的陣列裡的所有數字都在1~n的範圍內,所以陣列中至少有乙個數字是重複的,所以數字的範圍很關鍵,我們可以把數字的大小區間使用進行劃分。

**實現:

int countrange(const int* numbers, int length, int start, int end)

return count;

}int getduplication(const int* numbers, int length)

//二分選區間

if (count > (middle - start + 1)) //middle - start + 1 指的是區間數字個數

end = middle;

else

start = middle + 1;

} return -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 因為陣列中...