更新:有人能回答我对n.‘代词’‘m.’‘的回答的最后一个评论吗?
请注意:,我以前问过这个问题,但它是一个完整的混乱,所以我用更多的细节和原始的形式写它。
问题:
我正在管理一个N个参与者之间的投票系统(每个参与者的索引从1到N),其中我想支持以下功能:
在这个问题中,空间复杂度应该是O(N)。
只允许使用数组和(双)链接列表.
我做了什么?,我简单地简单地声明了一个数组,它的大小是N,每个单元格都包含值;got
和sent
。当i
投票给j
时,j
值增加,j
值增加,i
值增加1。
但我仍然不知道如何在所需的复杂性中解决5和6问题。
注意:,我正在寻找算法/想法,而不是实际的代码。
发布于 2020-11-07 16:40:33
请注意,对于每个操作,被投票支持的候选人的分数增加了整整一个。
这就打开了一个新的策略--而不是将一个候选人映射到它的分数,而是将一个分数映射到有这个分数的候选人列表中。
这可以很简单地实现为列表候选列表:(在模板,如语法:list<list<Candidate>>
)。
此外,保持一个数组将每个候选数映射到实际Candidate
元素的指针。
0的候选列表将在在O(1)中初始化数组的类似方式中隐式地设置为所有候选人。
Avoided()
中支持O(r)
:如果"0“列表中的元素数小于一半,则将其改为常规列表。2<->4
),这将确保O(n)
空间,因为没有太多的空列表节点。O(k)
中通过逐个迭代分数列表来完成(在输出k
考生之后停止)O(n) = O(r)
,或者由于插入中的优化(3)而避免使用O(r)
。发布于 2020-11-07 17:43:33
这里有一种可供选择的方法来实现Here ()。把两个号码和每一个被投票的人联系起来,开始运行和结束运行。最初,所有元素都被设置为None
(可以通过O(1)数组初始化技巧来完成)。
当person m
第一次被投票时,更新startOfRun
和endOfRun
数组:
if startOfRun[m-1] != None and startOfRun[m+1] == None
endOfRun[startOfRun[m-1]] = m
else if startOfRun[m-1] == None and startOfRun[m+1] != None
startOfRun[endOfRun[m+1]]
else if startOfRun[m-1] != None and startOfRun[m+1] != None
endOfRun[startOfRun[m-1]] = endOfRun[m+1]
startOfRun[endOfRun[m+1]] = startOfRun[m-1]
else
startOfRun[m] = m
endOfRun[m] = m
(为简洁而省略的边缘条件)。
现在你有很多被投票支持的人,你可以很容易地从一开始到每一次竞选结束。跑中的数字都是错误的,但我们并不在乎它们。有O(r)运行,所以您可以跳过所有在O(r)中投票赞成的人。
下面是实现受宠()的另一种方法。有两个数组,(1)按分数排序的扩展的人员数组,(2)从分数到第一个数组中的最后一个人的索引的映射,其得分不小于该值(如果没有这样的人,则为None
)。最初,第一个数组是空的,第二个数组包含None
的。
(array 1)
(index) 1 2 3 4 5 6 7 8 9
person 3 6 5 1 4 2 8 9 7
score 7 7 7 5 5 3 2 2 2
(array 2)
score 1 2 3 4 5 6 7 8 9
index in 1st 9 9 6 5 5 3 3 - -
一旦一个人第一次投票,它将被添加到数组的末尾,得分为1,并且更新array2[1]
。一旦该人再次被投票,它将与具有相同分数的数组中的第一个人交换,得分增加,第二个数组被更新(我们只需要更新一个元素,对应于新分数的元素)。
https://stackoverflow.com/questions/64729337
复制相似问题