找出沒有輸和只輸一次的玩家 Leetcode #2225

更新於 發佈於 閱讀時間約 4 分鐘

題目敘述

題目會給定我們一個比賽紀錄陣列matches,裡面以pair的方式儲存,每個pair的第一個欄位代表這場比賽的贏家ID,第二個欄位代表這場比賽的輸家ID。

題目要求我們找出所有沒有輸的玩家ID,和只輸一場的玩家ID

計算時,只考慮有比賽紀錄的玩家。

輸出時,依照遊戲玩家的ID,從小到大做排列。

題目的原文敘述


測試範例

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 <= 10^5

比賽陣列的長度介於1 ~ 10^5之間。

  • matches[i].length == 2

每條比賽紀錄都是一組pair。

  • 1 <= winneri, loseri <= 10^5

贏家ID和輸家ID都介於1 ~ 10^5 之間。

  • winneri != loseri

同一場比賽,贏家ID 一定不等於 輸家ID

  • All matches[i] are unique.

所有的比賽紀錄都是獨一無二的,不會重複。


演算法

這題的關鍵在於統計"輸"的次數

第一個是計算沒有輸,相當於輸的場次是0次。

為了避免和沒有出賽紀錄混淆,我們稍後在程式碼會特別標記為-1,作為有比賽而且沒有輸過的區別


第二個是計算只輸一場,相當於輸的計數器的值為1


最後,建造一個迴圈檢查,依照題意,輸出沒有輸和只輸一場的玩家ID,並且依照ID大小,從小到大排列即可


程式碼

class Solution:
def findWinners(self, matches):
losses = defaultdict(int)

for winner, loser in matches:
# For winner
if losses[winner] == 0:
losses[winner] = -1

# For loser
if losses[loser] == -1:
losses[loser] = 1
else:
losses[loser] += 1

zero_loss = [i for i in range(1, 100001) if losses[i] == -1]
one_loss = [i for i in range(1, 100001) if losses[i] == 1]

return [zero_loss, one_loss]

複雜度分析

時間複雜度:

從頭到尾掃描過每個場比賽紀錄,所需時間為O(n)

空間複雜度:

需要額外一個字典去紀錄輸的次數,最大為O(n)


關鍵知識點

看到需要統計次數,聯想到雜湊映射表 Hash table,
在Python的實現就是字典dictionary。


Reference:

[1] Python by counting and dictionary [w/ Comment]

avatar-img
91會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
題目敘述 題目會給我們兩個字串作為輸入,分別是字串s和字串t,問我最少要做幾次字元轉換,讓字串t和字串s成為Anagram"同字母異序詞"? 註: 例如 god 和 dog 就是 Anagram 同字母異序詞,也是就說,組成字母相同,但是順序可以重新排列。 題目的原文敘述 測試範例 Ex
題目敘述 題目會給我們一個輸入字串s,題目還保證字串s的長度一定是偶數。 要求我們判定字串s的前半部和後半部是否相似? 在本題中,兩個字串相似的定義為兩個字串都擁有相同的母音英文字母: 註: 母音英文字母為a, e, i, o, u, A, E, I, O, U 題目的原文敘述 測試
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 問我們任意祖先節點和晚輩節點之間,最大的差值的絕對值是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [8,3,10,1,6,null,14,null,null,4,7,13] Ou
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 並且給定感染的病毒源節點位置,每個單位時間,可以向相鄰的節點感染一次,問我們需要多少時間去感染整棵樹? 題目的原文敘述 測試範例 Example 1: Input: root = [1,5,3,null,4,10,6,
題目敘述 題目會給定我們一顆二元搜索樹BST的根結點, 還有一個指定區間的上邊界R 和 下邊界L。 請問二元搜索樹中,所有落在指定區間內的節點元素值的總和是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,15,3,7,null,18], l
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
題目敘述 題目會給我們兩個字串作為輸入,分別是字串s和字串t,問我最少要做幾次字元轉換,讓字串t和字串s成為Anagram"同字母異序詞"? 註: 例如 god 和 dog 就是 Anagram 同字母異序詞,也是就說,組成字母相同,但是順序可以重新排列。 題目的原文敘述 測試範例 Ex
題目敘述 題目會給我們一個輸入字串s,題目還保證字串s的長度一定是偶數。 要求我們判定字串s的前半部和後半部是否相似? 在本題中,兩個字串相似的定義為兩個字串都擁有相同的母音英文字母: 註: 母音英文字母為a, e, i, o, u, A, E, I, O, U 題目的原文敘述 測試
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 問我們任意祖先節點和晚輩節點之間,最大的差值的絕對值是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [8,3,10,1,6,null,14,null,null,4,7,13] Ou
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 並且給定感染的病毒源節點位置,每個單位時間,可以向相鄰的節點感染一次,問我們需要多少時間去感染整棵樹? 題目的原文敘述 測試範例 Example 1: Input: root = [1,5,3,null,4,10,6,
題目敘述 題目會給定我們一顆二元搜索樹BST的根結點, 還有一個指定區間的上邊界R 和 下邊界L。 請問二元搜索樹中,所有落在指定區間內的節點元素值的總和是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,15,3,7,null,18], l
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
別管目標,專注於系統就好 1.贏家跟輸家擁有相同目標 :很多人都說,贏得比賽的人是在多久之前就設立了目標並且致力朝著那個方向;然而,其實輸掉比賽的人,卻往往也是同樣的。沒有人不是朝著贏下比賽而前進的。如果說設定目標不是贏和輸的分水嶺,那究竟是甚麼,造成這正反相悖的結果。 2.目標達成不
Thumbnail
分享一個猜數字的遊戲題目,給予提示讓玩家找出正確的四位數密碼。
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
電競的最後一戰 所有的高手湧聚 不到最後一刻 不會知道 是誰贏了這場比賽
Thumbnail
謎題由模式組合而成,是用來破解的,永遠都有預定的秩序,永遠都有明確的答案。憑藉技巧和堅持的精神,一定能把謎題填完。遊戲的輸贏常常是靠運氣和隨機的環境,有偶然的成分,就算擁有全世界的天賦和決心,也未必能在遊戲中取勝。兩者有極大的差異。
Thumbnail
小明一直被金錢苦惱,總認為日子過得非常痛苦,凡事入不敷出,雖然有一筆儲蓄, 但總覺得不夠,擔心末來老了錢不夠用時該怎麼辦。 一天,他去參加一場同學聚會,由於太久沒見,大伙就喝開並有說有笑。 期間,他發現之前在學校總是開懷大笑的阿哲……
Thumbnail
兩側的門關閉,列車緩緩開動,至於要去的目的地,無人知曉。我和兩位夥伴們抱著塞滿六天五夜需要用到的物品的背包,忐忑地望著窗外。山、海、田、屋、樹、人——看著好多的風景,我悄悄地跟他們說:“我先睡一會,到了記得叫醒我。” 展翅營好像就是我大學時光的縮影。 在疫情爆發那年,我從家鄉
Thumbnail
題目敘述 題目會給定我們一個比賽紀錄陣列matches,裡面以pair的方式儲存,每個pair的第一個欄位代表這場比賽的贏家ID,第二個欄位代表這場比賽的輸家ID。 題目要求我們找出所有沒有輸的玩家ID,和只輸一場的玩家ID。 計算時,只考慮有比賽紀錄的玩家。 輸出時,依照遊戲玩家的ID,從
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
別管目標,專注於系統就好 1.贏家跟輸家擁有相同目標 :很多人都說,贏得比賽的人是在多久之前就設立了目標並且致力朝著那個方向;然而,其實輸掉比賽的人,卻往往也是同樣的。沒有人不是朝著贏下比賽而前進的。如果說設定目標不是贏和輸的分水嶺,那究竟是甚麼,造成這正反相悖的結果。 2.目標達成不
Thumbnail
分享一個猜數字的遊戲題目,給予提示讓玩家找出正確的四位數密碼。
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
電競的最後一戰 所有的高手湧聚 不到最後一刻 不會知道 是誰贏了這場比賽
Thumbnail
謎題由模式組合而成,是用來破解的,永遠都有預定的秩序,永遠都有明確的答案。憑藉技巧和堅持的精神,一定能把謎題填完。遊戲的輸贏常常是靠運氣和隨機的環境,有偶然的成分,就算擁有全世界的天賦和決心,也未必能在遊戲中取勝。兩者有極大的差異。
Thumbnail
小明一直被金錢苦惱,總認為日子過得非常痛苦,凡事入不敷出,雖然有一筆儲蓄, 但總覺得不夠,擔心末來老了錢不夠用時該怎麼辦。 一天,他去參加一場同學聚會,由於太久沒見,大伙就喝開並有說有笑。 期間,他發現之前在學校總是開懷大笑的阿哲……
Thumbnail
兩側的門關閉,列車緩緩開動,至於要去的目的地,無人知曉。我和兩位夥伴們抱著塞滿六天五夜需要用到的物品的背包,忐忑地望著窗外。山、海、田、屋、樹、人——看著好多的風景,我悄悄地跟他們說:“我先睡一會,到了記得叫醒我。” 展翅營好像就是我大學時光的縮影。 在疫情爆發那年,我從家鄉
Thumbnail
題目敘述 題目會給定我們一個比賽紀錄陣列matches,裡面以pair的方式儲存,每個pair的第一個欄位代表這場比賽的贏家ID,第二個欄位代表這場比賽的輸家ID。 題目要求我們找出所有沒有輸的玩家ID,和只輸一場的玩家ID。 計算時,只考慮有比賽紀錄的玩家。 輸出時,依照遊戲玩家的ID,從