给出一个未排序的数字列表(可以是int或double),给出一种算法,以遍历列表和线性时间来找到最小的非重复元素。 (没有空间限制)
例如
Given list is [2, 7, 9, 5, 2, 8, 3, 5, 1, 5, 6, 1]
Non-repeating elements are [7, 9, 8, 3, 6]
Min non-repeating element is 3
我通过创建两个散列集来尝试此操作,一个散列集用于存储非重复散列元素,另一个散点集用于存储非重复散列集的最小值。在某些情况下,这可以使我有线性的时间,但在所有情况下都不能。
谢谢。
答案 0 :(得分:2)
首先,找到所有非重复项,例如具有key = item和value = occurrences的哈希图。
接下来,遍历hashmap并找到值为1的最小键。
这在O(2n)中是线性的
答案 1 :(得分:-1)
使用斐波那契堆(FH)-最小
for i in L
If i == Find_Min(FH) // O(1) since the min in the top of the list.
Increase_key(min(FH), the_max_number)// \theta(1) in amortized.
else
Insert(FG) // \theta(1) in amortized.
if Find_Min(FH) == the_max_number
return nil
else
return Find_Min(FH)
使用增加键设置为the_max_number代替Extract_The_Mininimum
。
您将有Theta(n)摊销成本。请参阅第18章的Cormen,Leiserson和Rivest的《算法简介》第三版。