Welcome to Subscribe On Youtube
1086. High Five
Description
Given a list of the scores of different students, items
, where items[i] = [IDi, scorei]
represents one score from a student with IDi
, calculate each student's top five average.
Return the answer as an array of pairs result
, where result[j] = [IDj, topFiveAveragej]
represents the student with IDj
and their top five average. Sort result
by IDj
in increasing order.
A student's top five average is calculated by taking the sum of their top five scores and dividing it by 5
using integer division.
Example 1:
Input: items = [[1,91],[1,92],[2,93],[2,97],[1,60],[2,77],[1,65],[1,87],[1,100],[2,100],[2,76]] Output: [[1,87],[2,88]] Explanation: The student with ID = 1 got scores 91, 92, 60, 65, 87, and 100. Their top five average is (100 + 92 + 91 + 87 + 65) / 5 = 87. The student with ID = 2 got scores 93, 97, 77, 100, and 76. Their top five average is (100 + 97 + 93 + 77 + 76) / 5 = 88.6, but with integer division their average converts to 88.
Example 2:
Input: items = [[1,100],[7,100],[1,100],[7,100],[1,100],[7,100],[1,100],[7,100],[1,100],[7,100]] Output: [[1,100],[7,100]]
Constraints:
1 <= items.length <= 1000
items[i].length == 2
1 <= IDi <= 1000
0 <= scorei <= 100
- For each
IDi
, there will be at least five scores.
Solutions
-
class Solution { public int[][] highFive(int[][] items) { int size = 0; PriorityQueue[] s = new PriorityQueue[101]; int n = 5; for (int[] item : items) { int i = item[0], score = item[1]; if (s[i] == null) { ++size; s[i] = new PriorityQueue<>(n); } s[i].offer(score); if (s[i].size() > n) { s[i].poll(); } } int[][] res = new int[size][2]; int j = 0; for (int i = 0; i < 101; ++i) { if (s[i] == null) { continue; } int avg = sum(s[i]) / n; res[j][0] = i; res[j++][1] = avg; } return res; } private int sum(PriorityQueue<Integer> q) { int s = 0; while (!q.isEmpty()) { s += q.poll(); } return s; } }
-
class Solution { public: vector<vector<int>> highFive(vector<vector<int>>& items) { vector<int> d[1001]; for (auto& item : items) { int i = item[0], x = item[1]; d[i].push_back(x); } vector<vector<int>> ans; for (int i = 1; i <= 1000; ++i) { if (!d[i].empty()) { sort(d[i].begin(), d[i].end(), greater<int>()); int s = 0; for (int j = 0; j < 5; ++j) { s += d[i][j]; } ans.push_back({i, s / 5}); } } return ans; } };
-
class Solution: def highFive(self, items: List[List[int]]) -> List[List[int]]: d = defaultdict(list) m = 0 for i, x in items: d[i].append(x) m = max(m, i) ans = [] for i in range(1, m + 1): if xs := d[i]: avg = sum(nlargest(5, xs)) // 5 ans.append([i, avg]) return ans
-
func highFive(items [][]int) (ans [][]int) { d := make([][]int, 1001) for _, item := range items { i, x := item[0], item[1] d[i] = append(d[i], x) } for i := 1; i <= 1000; i++ { if len(d[i]) > 0 { sort.Ints(d[i]) s := 0 for j := len(d[i]) - 1; j >= len(d[i])-5; j-- { s += d[i][j] } ans = append(ans, []int{i, s / 5}) } } return ans }
-
function highFive(items: number[][]): number[][] { const d: number[][] = Array(1001) .fill(0) .map(() => Array(0)); for (const [i, x] of items) { d[i].push(x); } const ans: number[][] = []; for (let i = 1; i <= 1000; ++i) { if (d[i].length > 0) { d[i].sort((a, b) => b - a); const s = d[i].slice(0, 5).reduce((a, b) => a + b); ans.push([i, Math.floor(s / 5)]); } } return ans; }