用户喜好

用户喜好

http://www.nowcoder.com/questionTerminal/d25162386a3140cbbe6dc071e1eb6ed6

用户喜好

题目难度:中等

知识点:二分查找,STL,vector,map

解题思路:
1.输入人数,根据人数建立喜好度vector user(n)。
2.输入查询组数,根据组数建立左右区间数字l和r,以及查询喜好度数字k的vector。
3.建立喜好度与用户标号之间的对应关系map<int,vector< int > >,这里的第一个参数是喜好度数值,第二个参数vector<int>是该喜好度对应的用户标号。如题例中喜好度为1时,该vector中保存[1];喜好度为3时,该vector中保存[3,4]。
4.开始查询。根据k[i]中的喜好度查询数值,可以找到map中该喜好度对应的vector p。使用二分查找,可以在p中找到第一个大于等于l[i]的位置,以及第一个大于r[i]的位置。将两个位置相减即为所求人数,保存到res中。如题例所示,输入查询组数为:</int>

1 2 1
2 4 5
3 5 3
  • 当查询1 2 1这一组时,k[i]=1,l[i]=1,r[i]=2。根据k[i]从map中获得喜好度为1的vector p,它是[1]。那么lower_bound(p.begin(),p.end(),1)会返回一个指向1的迭代器,upper_bound(p.begin(),p.end(),2)会返回一个p.end()的迭代器,这时两个迭代器相减得1,输出1。
  • 当查询2 4 5这一组时,k[i]=5,l[i]=2,r[i]=4。根据k[i]从map中获得喜好度为5的vector p,它是[5]。那么lower_bound(p.begin(),p.end(),2)会返回一个指向5的迭代器,upper_bound(p.begin(),p.end(),4)也会返回一个指向5的迭代器,这时两个迭代器相减得0,输出0。
  • 当查询3 5 3这一组时,k[i]=3,l[i]=3,r[i]=5。根据k[i]从map中获得喜好度为3的vector p,它是[3,4]。那么lower_bound(p.begin(),p.end(),3)会返回一个指向3的迭代器,upper_bound(p.begin(),p.end(),5)会返回一个p.end()的迭代器,这时两个迭代器相减得2,输出2。
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
class solution
{
public:
    void func()
    {
        int n,q;
        cin>>n;                           //输入人数
        vector<int> user(n);
        for(int i=0;i<n;i++)
            cin>>user[i];                 //录入喜好度
        cin>>q;                           //查询组数
        vector<int> l(q),r(q),k(q);
        for(int i=0;i<q;i++)
            cin>>l[i]>>r[i]>>k[i];        //查询区间起点l,终点r,喜好度k
        map<int,vector<int> > mp;
        for(int i=0;i<n;i++)
            mp[user[i]].push_back(i+1);   //每个喜好度对应用户的标号存入vector与喜好度对应(注意下标+1)
        vector<int> res(q,0);             //结果
        for(int i=0;i<q;i++)              //根据组数循环得到结果
        {
            if(mp.count(k[i])!=0)         //如果该喜好度用户数不为0
            {
                vector<int> p = mp[k[i]]; //提出该喜好度对应用户标号的vector
                //二分查找
                //lower_bound(起始地址,结束地址,要查找的数值x) 
                //返回的是第一次出现大于等于x的地址
                //upper_bound(起始地址,结束地址,要查找的数值x) 
                //返回的是第一个大于x的地址
                //从p中找到≤r[i]的位置减去≥l[i]的位置,即为结果所求人数。
                res[i] = upper_bound(p.begin(), p.end(), r[i]) - lower_bound(p.begin(), p.end(), l[i]);
            }
        }
        for(int i = 0; i < q; ++i)
            cout << res[i] << endl;
    }
};
全部评论

相关推荐

头像
10-22 20:13
中南大学 Java
序言大家好呀。我是希晨er,一个初入职场的程序猿小登最近上班摸鱼刷到了一篇文章:10年深漂,放弃高薪,回长沙一年有感,还有聊聊30岁大龄程序员过往的心路历程,突然就有点感慨。我如今也做出了和大明哥一样的抉择,只是更早。此外我22年的人生,好像从来没好好记录过。正好现在工作不太忙,就想把这些经历写下来,也希望能得到社区里各位前辈的指点个人背景我是03年出生的西安娃,父母都是普通打工人。刚从中南大学软件工程专业毕业半年,现在在老家的央企过着躺平摆烂的日子成长轨迹从农村到城市的童年我家并不是西安的,只是爸妈在西安上班,从小学之后就把我接到了西安。后来老家房子拆了,爷爷奶奶也搬了过来。农村的生活,我觉...
Yki_:看哭了,恋爱那一段你女朋友说你不够关心她,可你毕竟也愿意遇到矛盾写几千字来和她慢慢分析;说不愿意给她花钱,我感觉可能只是消费观不一样;如果她想留在长沙,也应该提前跟你说开。不过她也许会心疼你放弃大厂offer转向数字马力?我也因为同样的原因有过一段幸福而充满遗憾的感情,不过跟爱情相比确实前途更重要一点。至于offer的选择,换我我也会这么选。把这些旧事记录下来以后,接下来就好好向前看吧,加油兄弟
🍊晨光随笔
点赞 评论 收藏
分享
面了100年面试不知...:头像换成柯南再试试
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务