題目詳見:1366. Rank Teams by Votes
解法一
思路
這道題是非常 straightforwad 的題目,只要讀懂題意,看懂幾個例子代表的 edge case 就可以寫出程式碼。
可以利用一個 HashMap 來記錄每個字母的得票情況,統計完成後,將字母依次加入定義好的 PriorityQueue 中。我們需要預先重寫 PriorityQueue 的排序方式。
最後將 PriorityQueue 中的字母按序取出拼接成字串。
程式碼
class Solution {
public String rankTeams(String[] votes) {
int length = votes[0].length(); // 字母個數
Map<Character, int[]> map = new HashMap<>();
// 對每次投票不同位置的字母依次取出
for (String vote : votes) {
for (int i = 0; i < length; i++) {
char c = vote.charAt(i);
map.putIfAbsent(c, new int[length]);
map.get(c)[i]++; // 對該字母相應位次計數
}
}
PriorityQueue<Character> pq = new PriorityQueue<>(new Comparator<Character>(){
@Override
public int compare(Character a, Character b) {
int[] aRank = map.get(a);
int[] bRank = map.get(b);
for (int i = 0; i < length; i++) {
if (aRank[i] != bRank[i]) {
return bRank[i] - aRank[i]; // 降序排列, 即得票權重高的在頂端
}
}
return a - b; // 如果所有字母得票情況一樣, 升序排列, 即按字母順序排列
}
});
for (Map.Entry<Character, int[]> entry : map.entrySet()) {
pq.offer(entry.getKey());
}
StringBuilder sb = new StringBuilder(); // Generate the result
while (!pq.isEmpty()) {
sb.append(pq.poll());
}
return sb.toString();
}
}
複雜度分析
- 時間複雜度 遍歷陣列 O(26N), 將陣列新增進 PriorityQueue 需要 O(26N*logN) 的時間,所以總時間複雜度 O(NlogN).
- 空間複雜度 最多有26個字母,votes 陣列長度為 N,則 map 需要有 O(26N) = O(N) 的空間來儲存
本作品採用《CC 協議》,轉載必須註明作者和本文連結