数组——找重复元素
給定一個數組,數組長度為n,元素值為1~n-1,也就是說這個數組里面至少有一個元素是重復的。找出一個重復的元素,并且把這個元素值返回。
例如:arr[5] = {1,3,4,2,2};返回2
本篇博客主要記錄以下三種方法:
1.元素對號入座(空間換時間)
2.在原數組上不斷操作,將元素換到對應的下標中
3.快慢指針
一、元素對號入座(空間換時間)
思路:由于數組大小為n,元素值為1~n-1,我們直接申請一個n大小的空間,將元素值賦值到申請的空間下標與其值相等的單元格中,如果沒有重復,正好一個單元格放一個元素(0下標沒有元素放),有重復,就會出現覆蓋的情況。
代碼:
二、在原數組上不斷操作,將元素換到對應的下標中
思路:將0下標的值不斷的與其值相等的下標的值交換。
如下圖,arr[0] == 1,1本來應該放到arr[1]中的,所以就將arr[0]的值和arr[1]的值交換。其實和第一個方法一樣,也是交換一次,完成了對一個元素的歸位。這個沒有借助輔助空間。準確的說,只借助了arr[0],因為arr[0]不該有元素存放。
如下圖,將arr[0]的值與arr[2]的值交換
如下圖,將arr[0]的值與arr[3]的值交換
如下圖,當我們將arr[0]的值與arr[2]交換的時候,發現arr[2]的值就是2,說明值重復了。
代碼:
三、快慢指針
首先要知道,如果元素存在重復的,那么將會存在環。(這里不著重驗證是否是環的問題)。
比如arr[7] = {1,2,4,6,3,5,4};
1->2->4->3->6->4->3->6->4…
以前面的值為下標確定箭頭后的值,結果發現3->6->4->3…構成環。
快慢指針是判斷環的最常用的方法。快慢指針原理點擊此處。
代碼:
總結