題目連結:
題目意譯:
你正在遊玩一個遊戲其包含著數個角色,且每個角色有著兩個主要屬性:攻擊力以及防禦力。你被給定一個二維整數陣列 properties 其中 properties[i] = [attacki, defensei] 代表著遊戲中第 i 個角色的屬性。
一個角色會被稱為弱角如果有任何其他的角色的攻擊力以及防禦力皆嚴格大於此角色的攻擊與防禦力。更正式地說,一角色 i 會被稱為弱角如果存在另一角色 j 其中 attackj > attacki 且 defensej > defensei。
回傳弱角的數量。
限制:
2 ≦ properties.length ≦ 10 ^ 5
properties[i].length == 2
1 ≦ attacki 、 defensei ≦ 10 ^ 5
範例測資:
範例 1:
輸入: properties = [[5,5],[6,3],[3,6]]
輸出: 0
解釋: 沒有角色的攻擊力和防禦力嚴格大於他人。
範例 2:
輸入: properties = [[2,2],[3,3]]
輸出: 1
解釋: 第一個角色是弱角因為第二個角色有著嚴格大於他的攻擊力與防禦力。
範例 3:
輸入: properties = [[1,5],[10,4],[4,3]]
輸出: 1
解釋: 第三個角色是弱角因為第二個角色有著嚴格大於他的攻擊力與防禦力。
解題思維:
可以看到本題的「非」弱角有點像是
這題的「極大點」,不過定義稍有不同。
我們可以將 properties 先按照攻擊力(第一個數值)由大到小排,攻擊力相同的再按照防禦力(第二個數值)由小到大排。接著我們從排序後的第 0 個角色(即 properties[0])開始掃過所有角色,而且我們可以確定他必定不會是弱角(因為沒有人攻擊力大於他),因此非弱角計數 + 1 且令 X = properties[0][1](他的防禦力)。
當 properties[i][1] 大於等於 X 時,代表他不會比前一個非弱角還要弱(因為至少防禦力大於等於前一者),因此非弱角之數量又會加 + 1 並且我們將 X 更新為 properties[i][1]。
如上便可以找出所有的非弱角之數量 C。最後我們可以看到所求之弱角的數量即為 properties.length - C 個。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。