题目
1、题目描述
给你一个整数数组 matches 其中 matches[i] = [winneri, loseri] 表示在一场比赛中 winneri 击败了 loseri 。
返回一个长度为 2 的列表 answer :
answer[0] 是所有 没有 输掉任何比赛的玩家列表。
answer[1] 是所有恰好输掉 一场 比赛的玩家列表。
两个列表中的值都应该按 递增 顺序返回。
注意:
只考虑那些参与 至少一场 比赛的玩家。
生成的测试用例保证 不存在 两场比赛结果 相同 。
2、原题链接
解题报告
1、解题思路
(1)使用哈希表存每位选手的状态。-1代表没有登场。0代表全赢。1代表只输了一场。大于1代表输了多于1场。
(2)枚举每一场比赛,判断之前是否访登场。按照状态值存储对应数据。
(3)枚举哈希表,找到所有参赛玩家。判断状态并将玩家填入对应数组中。
(4)返回叠加好的数组。
2、解题方法
哈希
2、代码详解
class Solution {
public:
vector<vector<int>> findWinners(vector<vector<int>>& matches) {
vector<vector<int>> ret;
vector<int> winr;
vector<int> losr;
int user[100010];
int matchesSize = matches.size();
memset(user, -1, sizeof(user));
ret.clear();
for(int i = 0; i < matchesSize; ++i){
int winer = matches[i][0];
int loser = matches[i][1];
if(user[winer] == -1){
user[winer] = 0;
}
if(user[loser] == -1){
user[loser] = 1;
}else{
user[loser]++;
}
}
for(int i = 0; i < 100010; ++i){
if(user[i] == -1) continue;
if(user[i] == 0){
winr.push_back(i);
}else if(user[i] == 1){
losr.push_back(i);
}
}
ret.push_back(winr);
ret.push_back(losr);
return ret;
}
};
总结
数据量大用哈希基本都可以过。