如何解决打印Oj中的元素?
我有N
个人,并且想参加选举。
我想在O(1)
中保存每个人对他的投票以及他对其他人的投票。
(我已经通过声明一个长度为N
且在每个单元格中具有两个属性的数组taken
和given
来完成这一部分。
当1票对2票时,我将个人2的taken
和个人1的given
加1。)
我该如何打印所有在O(j)
中得不到任何投票的个人,其中j
是这些个人的人数?
我只能使用O(N)
空间。 (请解释一下想法而不是代码)
注意:我只知道数组,列表和双向链接列表。 (请解释一下想法而不是代码),我想在O(1)中初始化数据结构
解决方法
如果您获得了N个人的名单并将其分为2:
- 一个包含获得投票的个人的列表,我们称其为
V
; - 一个包含未获得投票的个人的列表,我们将其称为
J
。
起初,您将所有个人都放在同一列表(J
)中,当他们获得选票时,您将其从一个列表(J
)中删除,然后将它们放入另一个列表({ 1}})。
假设您不计算维护2个列表所需的开销,这仍应满足O(N)空间限制,因为| N | = | J | + | V |。
因此,根据要打印的结果,将在适当的列表上进行迭代。如果您需要打印所有信息,则将遍历两者。
根据您的问题,要获得O(K)中票数最多的K个人,您可以:
- 假设您对数据的插入/更新方式没有任何限制,则可以对每个插入/更新操作使用列表。这样,当您需要阅读列表的内容时,您就知道列表已经被排序,并且表现最佳的个人位于列表的开头。
- 有点类似,但是幕后花了很多功夫,您可以看看Map数据结构。如您所见,还有一个
V
函数也可以提供。根据文档,元素将根据此compare
函数的结果进行排序。这两个选项的作用相同,但是在选项1中,您正在执行所有代码,而在选项2中,您将把繁重的工作留给compare
实现。
您可以使用HashMap,Hashmap的访问复杂度为O(1)。 在您的情况下,您可以将投票数用作键,将没有获得任何投票的人作为值的数组。这将允许您访问O(1)中的数组。并以O(数组长度为“你所说的j”)获得数组中的任何人
,这不是完整的代码,但是这种创建哈希映射的逻辑将对您有用https://www.geeksforgeeks.org/implementing-multidimensional-map-in-c/ // C ++ 14代码实现二维地图 //并通过insert()插入值
#include <bits/stdc++.h>
using namespace std;
int main()
{
int vote_gain = 0;
int vote_cast = 0;
// First key type is a string
map<string,map<string,int> > m;
map<string,int> >::iterator itr;
map<string,int>::iterator ptr;
m.insert(make_pair("arun",int>()));
m["arun"].insert(make_pair("received",++vote_gain));
m["arun"].insert(make_pair("cast",++vote_cast));
for (itr = m.begin(); itr != m.end(); itr++) {
for (ptr = itr->second.begin(); ptr != itr->second.end(); ptr++) {
cout << "The candidate " << itr->first
<< " has " << ptr->first
<< " a vote " << ptr->second << endl;
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。