如何判斷乙個整數陣列中是否有重複元素

2021-06-18 14:56:13 字數 1790 閱讀 3108

題目:

寫乙個函式判斷乙個int型別的陣列是否是有效的。 

所謂有效是指:假設陣列大小為n,那麼這個int陣列裡的值為0~n-1之間的數,並且每個數只能出現一次,否則就是無效陣列。 

例如[5,3,1,4,2,0]是有效的,[5,3,5,1,2,0]是無效的,[5,3,6,1,2,0]是無效的。 

解法思路一:置換的思想

用乙個temp來儲存被置換出來的值,例如陣列a:

5    3    1   4   2   0

首先,初始化時取第乙個數5,將5放在陣列的第5號位置,將原來的位置改為-1,5號被置換出來的值放在 temp。即,

-1   3   1   4   2   5       temp=0

下一步,將temp中的值放在a[temp]中:

0   3   1   4   2   5

接著,置換3:

0   -1   1   3   2   5  temp=4

0   -1   1   3   4   5  temp=2

0   -1   2   3   4   5   temp=1

0   1   2   3   4   5

排序成功,然後直接遍歷一遍,後面的元素前前面的元素,值為0,則有重複。

優點:只申請了乙個元素的空間

缺點:1. 結束條件比較複雜;

(1)用乙個index進行初始化temp操作,

置換過程中,如果temp置換的是-1,則取出index所指的元素賦給temp,並index++;

如果temp置換的不是-1,則取出temp要置換的內容賦給temp;

(2)可以用乙個count進行計數,最多置換n次,作為結束條件。

2. 對使用條件比較苛刻,陣列必須是儲存的剛好[0, n-1]

解決思路二:置反的思想

不用移動的方法 

5   3   1   4   2   0  

==》0) 5   3   1   4   2  -0      i=0; 取出j=|a[i]|=5; 令a[j]=-a[5]=-0 

1)  5   3   1  -4   2   0      i=1; 取出j=|a[i]|=3; 令a[j]=-a[3]=-4   

2)  5  -3   1  -4   2   0      i=2;     j=|a[i]|=1; 令a[1]=-a[1]=-3 

3)  5  -3   1  -4  -2   0      i=3;     j=|a[i]|=4; 令a[4]=-a[4]=-2 

4)  5  -3  -1  -4  -2   0      i=4;     j=|a[i]|=2; 令a[2]=-a[2]=-1 

5) -5  -3  -1  -4  -2   0      i=5;     j=|a[5]|=0; 令a[0]=-a[0]=-5 

所有數為非正整數,且0只有乙個,成功。同時執行一遍迴圈把負數弄回去,複雜度0(2n) 

在遍歷的過程中,如果發現要取反的值為負的,說明陣列中曾經存在過乙個i值,使a[i]變為負數,則可知道有重複 

優點:1. 不需要申請空間;

缺點:使用條件苛刻:連續[0, n-1]的值

解決思路三:陣列map的思想

要求空間複雜度為o(1),那麼可以申請常數大小的空間,由於int最大表示範圍為65536,我們可以直接申請65536大小的陣列b。

將原陣列中的a[i],通過b[a[i]]++,來進行計數,如果值超過1,則表明有重複。

缺點:申請空間比較大

優點:使用條件寬鬆,可以用於連續整數,也可以用於非連續整數的排序。

該思想很重要,需要掌握!!!

給定乙個整數陣列,判斷是否存在重複元素。

給定乙個整數陣列,判斷是否存在重複元素。如果任何值在陣列 現至少兩次,函式返回 true。如果陣列中每個元素都不相同,則返回 false。示例 1 輸入 1,2,3,1 輸出 true 示例 2 輸入 1,2,3,4 輸出 false 示例 3 輸入 1,1,1,3,3,4,3,2,4,2 輸出 t...

演算法 給定乙個整數陣列,判斷是否存在重複元素

class solution return false 分析 演算法的核心是用了hashset不允許有重複元素的特性 且hashset中有方法add為當內部有重複元素時返回true 內部沒有重複元素時返回ture,利用這個性質只要遍歷一次陣列就能判斷,顯得比較方便 另乙個知識點是 return對於乙...

使用Python判斷乙個正整數數是否為素數

判定乙個數是否為素數的基本思路 1 了解素數的定義,乙個正整數n若為素數,則它的約數只能是1和n本身,2 根據定義,我們需要將這個數除以從2到n 1之間的全部正整數,如果全部都不能整除,則這個數便是素數。若是其中有乙個數能被整除,則這個數是個合數,而不是素數。因此,用求餘演算法 不失為一種有效的方法...