网易笔试题目练习
牛牛找工作(贪心)
原题目以及java解法
核心思想:用哈希表和排序降低时间复杂度
技巧在于:
- 用哈希:使得输入某个伙伴能力值后可以立刻输出最优解
- 用排序:实现贪心算法,避免二重循环,排序后O(n)一遍更新就可以得到所有最优解
数据结构:
D[i]数组(值
≥
\geq
≥ 0),i=0,1,…,m+n-1, 先存入工作难度再存人能力值
hs_Pay hashmap(D[i]->P[i])
对D[i]排序(sort), D[i]->P[i]的最大值就是max(P[0],P[1],…,P[i])
如此将hs_Pay更新成目标所求(maxPay)
再用hs_Pay输出每个人的最大收入的工作(maxPay)即可
示例输入:
3 3
1 100
10 1000
1000000000 1001
9 10 1000000000
示例输出:
100
1000
1001
//官方题解的理解基础之上的C++版本
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
typedef long long ll;
int main()
{
int N, M; cin >> N >> M;
vector<int> D(N + M);
unordered_map<int, int>hsPay;
int i;
for (i = 0; i < N; i++)//输入(工作难度,收入)
{
cin >> D[i];
cin>>hsPay[D[i]];
}
vector<int>Capab; //!易错点 别写成Capab(M) 否则后面别push_back,要改成直接赋值
for (i = N; i < N + M; i++)//输入伙伴工作能力
{
cin >> D[i];
Capab.push_back(D[i]);
if (hsPay.find(D[i]) == hsPay.end())
hsPay[D[i]] = 0; //没有记录的能力值暂定收入为0,方便后续排序(贪心)
}
sort(D.begin(), D.end()); //算法库中的排序
//更新hsPay为最优解
int max = 0;
for (i = 0; i < D.size(); i++)
{
if (max < hsPay[D[i]])max = hsPay[D[i]];
hsPay[D[i]] = max;
}
for (i = 0; i < M; i++)
cout << hsPay[Capab[i]]<<endl;
}
易错点:
vector的使用(Define and Use):
- 要么别开空间,直接push_back,就像python-list,
- 要么开好空间,直接赋值,就像普通数组
1、 第一种情况
//定义
vector<int>List;
...
//使用中
List.push_back(xx);
2、第二种情况
//定义
vector<int>nums(n);
...
//使用中
nums[i]=xx;
不可混淆,避免在一串0之后push_back或者指针越界报错。