微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

打印Oj中的元素?

如何解决打印Oj中的元素?

我有N个人,并且想参加选举。

我想在O(1)中保存每个人对他的投票以及他对其他人的投票。

(我已经通过声明一个长度为N且在每个单元格中具有两个属性的数组takengiven来完成这一部分。 当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个人,您可以:

  1. 假设您对数据的插入/更新方式没有任何限制,则可以对每个插入/更新操作使用列表。这样,当您需要阅读列表的内容时,您就知道列表已经被排序,并且表现最佳的个人位于列表的开头。
  2. 有点类似,但是幕后花了很多功夫,您可以看看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 举报,一经查实,本站将立刻删除。