Last Updated on 2022-11-28 by Clay
題目
You are given an integer array matches
where matches[i] = [winneri, loseri]
indicates that the player winneri
defeated player loseri
in a match.
Return a list answer
of size 2
where:
answer[0]
is a list of all players that have not lost any matches.answer[1]
is a list of all players that have lost exactly one match.
The values in the two lists should be returned in increasing order.
Note:
- You should only consider the players that have played at least one match.
- The testcases will be generated such that no two matches will have the same outcome.
Example 1:
Input: matches = [[1,3],[2,3],[3,6],[5,6],[5,7],[4,5],[4,8],[4,9],[10,4],[10,9]] Output: [[1,2,10],[4,5,7,8]] Explanation: Players 1, 2, and 10 have not lost any matches. Players 4, 5, 7, and 8 each have lost one match. Players 3, 6, and 9 each have lost two matches. Thus, answer[0] = [1,2,10] and answer[1] = [4,5,7,8].
Example 2:
Input: matches = [[2,3],[1,3],[5,4],[6,4]] Output: [[1,2,5,6],[]] Explanation: Players 1, 2, 5, and 6 have not lost any matches. Players 3 and 4 each have lost two matches. Thus, answer[0] = [1,2,5,6] and answer[1] = [].
Constraints:
1 <= matches.length <= 105
matches[i].length == 2
1 <= winneri, loseri <= 105
winneri != loseri
- All
matches[i]
are unique.
題目輸入一連串的比賽結果 matches
,matches[i][0]
代表第 i 回合的勝者、matches[i][1]
代表第 i 回合的敗者。
最終,我們希望返回 {{完全沒輸過的參賽者}, {只輸過一場的參賽者}}
這樣的結果。需要注意的是,完全沒輸過的參賽者至少也要參加過一次比賽。
解題思路
我這題的解法比較直接,當然 Runtime 的分數就不是很好看... 我直接建立了一個 lossTimes
的雜湊表,key 值是參賽者編號,value 則是輸掉的次數。
當然從來沒參賽的人就不會存在著 key 值,而我們可以透過 value 的累積直接判斷這個參賽者輸過幾場。
C++ 範例程式碼
class Solution {
public:
vector<vector<int>> findWinners(vector<vector<int>>& matches) {
// Init
int highestPlayer = 0;
unordered_map<int, int> lossTimes;
vector<vector<int>> results(2);
// Records match results
for (int i=0; i<matches.size(); ++i) {
lossTimes[matches[i][0]] += 0;
lossTimes[matches[i][1]] += 1;
highestPlayer = max(max(matches[i][0], matches[i][1]), highestPlayer);
}
// Save to `results`
for (int i=1; i<=highestPlayer; ++i) {
if (!lossTimes.count(i)) {
continue;
}
if (lossTimes[i] == 0) {
results[0].push_back(i);
}
else if (lossTimes[i] == 1) {
results[1].push_back(i);
}
}
return results;
}
};
Python 範例程式碼
class Solution:
def findWinners(self, matches: List[List[int]]) -> List[List[int]]:
# Init
highest_idx = 0
loss_times = {}
results = [[], []]
# Records match results
for match in matches:
loss_times[match[0]] = loss_times.get(match[0], 0) + 0
loss_times[match[1]] = loss_times.get(match[1], 0) + 1
highest_idx = max(max(match[0], match[1]), highest_idx)
# Save to `results`
for idx in range(1, highest_idx+1):
if loss_times.get(idx, -1) == 0:
results[0].append(idx)
elif loss_times.get(idx, -1) == 1:
results[1].append(idx)
return results