3 回答

TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊
如果輸入數(shù)組未排序(并且根據(jù)您的說(shuō)法 - 未排序),您將無(wú)法在O(n)
時(shí)間和空間上完成任務(wù)。O(1)
這是不可能的,因?yàn)闉榱藙h除元素,您必須檢查數(shù)組中之前或之后的任何位置是否有重復(fù)項(xiàng)。
要檢查重復(fù)項(xiàng),您必須:
掃描輸入數(shù)組(這將導(dǎo)致
O(n^2)
整個(gè)算法的時(shí)間)使用額外的空間,例如使用
Set
(這將導(dǎo)致O(n)
時(shí)間和O(n)
空間)。
所以基本上你必須權(quán)衡時(shí)間和空間,反之亦然。

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊
這可能是不可能的,除非數(shù)組使用鏈表進(jìn)行排序或?qū)⒃貥?biāo)記為 Integer.MIN_VALUE,應(yīng)用此原則的“空間和時(shí)間權(quán)衡”如果我們需要更快的時(shí)間,那么我們需要權(quán)衡空間,反之亦然。
如果使用數(shù)組,那么您可以將重復(fù)元素標(biāo)記為 Integer.MIN_VALUE(在 java 中或在 c/c++ 中 -2^16),并且可以忽略該值。
如果使用鏈表并且數(shù)組已排序,則只需檢查下一個(gè)節(jié)點(diǎn)與前一個(gè)節(jié)點(diǎn)并刪除下一個(gè)重復(fù)節(jié)點(diǎn)。

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊
您必須“檢查所有前面的內(nèi)容”,而不是“檢查下一個(gè)”。
那么問(wèn)題就變成了,“如何檢查一個(gè)數(shù)字在恒定時(shí)間內(nèi)是否存在于任意數(shù)量的其他元素中”?
使用一個(gè)HashSet
. 基于哈希的結(jié)構(gòu)的所有操作都是 O(1)。
add()
考慮使用和contains()
的兩種方法HashSet
。
我把寫(xiě)的代碼留給你......
添加回答
舉報(bào)