力扣第 287 场周赛 :输掉零场或一场比赛的玩家

简介: 给你一个整数数组 matches 其中 matches[i] = [winneri, loseri] 表示在一场比赛中 winneri 击败了 loseri 。

3.png

一、问题描述


给你一个整数数组 matches 其中 matches[i] = [winneri, loseri] 表示在一场比赛中 winneri 击败了 loseri

返回一个长度为 2 的列表 **answer

  • answer[0] 是所有 没有 输掉任何比赛的玩家列表。
  • answer[1] 是所有恰好输掉 一场 比赛的玩家列表。

两个列表中的值都应该按 递增 顺序返回。


注意:

  • 只考虑那些参与 至少一场 比赛的玩家。
  • 生成的测试用例保证 不存在 两场比赛结果 相同


题目链接:输掉零场或一场比赛的玩家

二、题目要求


样例

输入: matches = [[1,3],[2,3],[3,6],[5,6],[5,7],[4,5],[4,8],[4,9],[10,4],[10,9]]
输出: [[1,2,10],[4,5,7,8]]
解释:
玩家 1、2 和 10 都没有输掉任何比赛。
玩家 4、5、7 和 8 每个都输掉一场比赛。
玩家 3、6 和 9 每个都输掉两场比赛。
因此,answer[0] = [1,2,10] 和 answer[1] = [4,5,7,8] 。


考察

哈希、判重
建议用时15~35min


三、问题分析


这一题其实很好理解,一开始我的想法是用哈希表统计输掉比赛的人。

输掉0场就只判断赢得比赛的玩家在不在里面就行,输掉一场直接在判断哈希表的值为1就行。

但这种方法有个缺陷,执行用时太长了,还需要对赢得人进行判重操作,防止重复加入。

66.png

开始优化!

67.png

map可以自动排序,所以这次利用map输出存储。我们先存储赢的玩家到map,初始值置为0。再存储输的玩家到map,这时候我们只需要判断0 1就行。


四、编码实现


1.优化前

classSolution {
public:
vector<vector<int>>findWinners(vector<vector<int>>&matches) {
map<int,int>l,k;//map存储输掉比赛的人数inti,j,m=matches.size();//初始化数据vector<int>ans1,ans2;//分别存储for(i=0;i<m;i++)
l[matches[i][1]]++;//记录输掉比赛的人数for(i=0;i<m;i++)
        {
if(l[matches[i][0]]==0&&k[matches[i][0]]==0)//没有输            {
ans1.push_back(matches[i][0]);
k[matches[i][0]]=1;//用来判重            }
if(l[matches[i][1]]==1&&k[matches[i][1]]==0)//只输一场            {
ans2.push_back(matches[i][1]);
k[matches[i][1]]=1;//用来判重            }
        }  
sort(ans1.begin(),ans1.end());//排序sort(ans2.begin(),ans2.end());//排序return {ans1,ans2};//输出结果    }
};


2.优化后

classSolution {
public:
vector<vector<int>>findWinners(vector<vector<int>>&matches) {
map<int,int>m;//定义mapvector<int>ans1,ans2;
inti,n=matches.size();//初始数据for(i=0;i<n;i++)//存储赢得人数、置为0m[matches[i][0]]=0;
for(i=0;i<n;i++)//存储输人数++m[matches[i][1]]++;
for(autoj=m.begin();j!=m.end();j++)//在map循环内部存储输出        {
if(j->second==0)//为0ans1.push_back(j->first);//存储没输的玩家elseif(j->second==1)//为1ans2.push_back(j->first);//存储只输一场的玩家        }
return {ans1,ans2};
    }
};


五、测试结果

65.png

相关文章
|
8月前
|
Go
golang力扣leetcode 675.为高尔夫比赛砍树
golang力扣leetcode 675.为高尔夫比赛砍树
57 0
|
8月前
|
Go
golang力扣leetcode 第 291 场周赛
golang力扣leetcode 第 291 场周赛
78 0
|
8月前
|
Go vr&ar
golang力扣leetcode 第 288 场周赛
golang力扣leetcode 第 288 场周赛
58 0
|
8月前
|
Go
golang力扣leetcode 第 286 场周赛
golang力扣leetcode 第 286 场周赛
67 0
|
8月前
|
Go
golang力扣leetcode第 294 场周赛
golang力扣leetcode第 294 场周赛
64 0
|
8月前
|
算法 Java Go
golang力扣leetcode 第 293 场周赛
golang力扣leetcode 第 293 场周赛
92 0
|
8月前
|
Go
golang力扣leetcode 第 290 场周赛
golang力扣leetcode 第 290 场周赛
56 0
|
8月前
|
Go C++
golang力扣leetcode 第 284 场周赛
golang力扣leetcode 第 284 场周赛
66 0
|
8月前
|
Go
golang力扣leetcode 第 292 场周赛
golang力扣leetcode 第 292 场周赛
74 0
|
8月前
|
存储
Leetcode第383场周赛
在LeetCode第383场周赛中,选手完成了3道题目。第一题是关于边界上的蚂蚁,蚂蚁根据非零整数数组nums的值移动,返回蚂蚁返回边界上的次数。解题方法是计算数组累加和为0的次数。第二题涉及计算网格的区域平均强度,给定一个灰度图像和阈值,返回每个像素所属区域的平均强度。解题关键在于理解相邻像素和区域定义,并计算平均强度。第三题是恢复单词初始状态的最短时间问题,通过移除前k个字符并添加k个字符,求恢复原词所需的最短时间。解题策略是检查去除前k个字符后的子串是否能作为原词的前缀。
39 1
Leetcode第383场周赛
下一篇
开通oss服务