題目:
寫乙個函式判斷乙個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之間的全部正整數,如果全部都不能整除,則這個數便是素數。若是其中有乙個數能被整除,則這個數是個合數,而不是素數。因此,用求餘演算法 不失為一種有效的方法...