找出乙個重複元素

2021-06-22 08:16:34 字數 1254 閱讀 4141

1. 問題描述

取值為[1,n-1]含n個元素的整數陣列至少存在乙個重複數,o(n)時間內找出其中任意乙個重複數。如a=,則2和4均是重複元素。

2. 解決方案

【方案一】

《採用位圖》使用大小為n點陣圖,記錄每個元素是否出現過,一旦遇到乙個已經出現過的元素,則直接輸出。時間複雜度是o(n),空間複雜度為o(n)。

《陣列排序》首先對陣列進行計數排序,然後順次掃瞄整個陣列,直到遇到乙個已出現的元素,直接將之輸出。時間複雜度為o(n),空間複雜度為o(n)。

以上兩種方案需要額外的儲存空間,能不能不適用額外儲存空間呢?

【方案二】

首先問面試官,以確定陣列元素是否為signedint,如果是,則可採用該方案:將陣列元素值作為索引,對於元素a[i],如果a[a[i]]大於0,則設定a[a[i]]=-a[a[i]];如果a[a[i]]小於0,則a[a[i]]是乙個重複數,直接輸出,最後還原a中各個被修改的元素。**如下:

intfind_duplicated_integer(

int a,

int n)

else

}else

else}}

}int reset_array(

int a,

int n)

}【方案三】

《單鏈表存在環》第三種解決方案有很強的技巧性。「判斷單鏈表是否存在環」是乙個非常經典的問題,同時單鏈表可以採用陣列實現,此時每個元素值作為next指標指向下乙個元素。該題可以轉化為「已知乙個單鏈表中存在環,找出環的入口點」。

該題思路如下:將a[i]看做第i個元素的索引,即:a[i]->a[a[i]]->a[a[a[i]]]->a[a[a[a[i]]]]->….最終形成乙個單鏈表,由於陣列a中存在重複元素,則一定存在乙個環,且環的入口元素即為重複元素。

該題的關鍵在於,陣列a的大小時n,而元素的範圍是[1,n-1],所以a[0]不會指向自己,進而不會陷入錯誤的自迴圈。如果元素的範圍中包含0,則該題不可直接採用該方法。

**如下:

intfind_duplicated_integer2(

int a,

int n)

while

(x != y);

//找到環中的乙個點

x =0;

dowhile

(x != y);

//找到入口點

return x; }

pastedfrom <>

找出陣列中唯一的重複元素

問題 1 1000放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其它均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來 不用輔助儲存空間,能否設計乙個演算法實現?include include include 根據異或法的計算方式,每兩個相異的數執行異或運算之後,結果為1...

檢查乙個列表是否有重複元素

像計算機科學家一樣思考python 第10章練習10 7 編寫乙個名為has duplicates的函式接收乙個列表,當其中任何乙個元素出現多於一次時返回true。它不應當修改原始列表。自己實現的 用while迴圈 def has duplicates t new t sorted t index ...

陣列中找出任意重複元素

在0 n 1個數中找出出現次數大於一的任意乙個元素 有兩種做法 資料樣例 2,3,2,0,2,5,3 資料索引 0,1 2,3,4,5,6 因為給定範圍0 n 1,如果有重複,肯定有元素放在它所在值的索引上之後,還有與它值相同的元素跟自己的索引值對不上,樣例中如果把2放到no.2處,no.0處的2和...