1366. Rank Teams by Votes

Borris發表於2020-03-05

題目詳見: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 協議》,轉載必須註明作者和本文連結

相關文章