@@ -61,9 +61,9 @@ id 为 "b" 和 "c" 的视频都满足播放量最高的条件。
61
61
62
62
** 方法一:哈希表**
63
63
64
- 我们用哈希表 ` cnt ` 统计每个创作者的视频播放量总和 ,用哈希表 ` d ` 和 ` x ` 记录每个创作者的最大播放量和对应的视频 ` id ` 。
64
+ 我们遍历三个数组,用哈希表 $ cnt$ 统计每个创作者的播放量总和 ,用哈希表 $d$ 记录每个创作者播放量最大的视频的下标 。
65
65
66
- 然后遍历哈希表 ` cnt ` ,找到最大视频播放量总和的创作者,将其对应的视频 ` id ` 加入答案数组 ` ans ` 中 。
66
+ 然后,我们遍历哈希表 $ cnt$,找出最大的播放量 $mx$;接着再次遍历哈希表 $cnt$,找出播放量为 $mx$ 的创作者,将其加入答案数组中 。
67
67
68
68
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为视频数量。
69
69
@@ -77,21 +77,13 @@ id 为 "b" 和 "c" 的视频都满足播放量最高的条件。
77
77
class Solution :
78
78
def mostPopularCreator (self , creators : List[str ], ids : List[str ], views : List[int ]) -> List[List[str ]]:
79
79
cnt = defaultdict(int )
80
- d = {}
81
- x = {}
82
- for c, i, v in zip (creators, ids, views):
80
+ d = defaultdict(int )
81
+ for k, (c, i, v) in enumerate (zip (creators, ids, views)):
83
82
cnt[c] += v
84
- if c not in d or d[c] < v or (d[c] == v and x[c] > i):
85
- d[c], x[c] = v, i
86
- ans = []
87
- pre = - 1
88
- for a, b in cnt.items():
89
- if b > pre:
90
- ans = [[a, x[a]]]
91
- pre = b
92
- elif b == pre:
93
- ans.append([a, x[a]])
94
- return ans
83
+ if c not in d or views[d[c]] < v or (views[d[c]] == v and ids[d[c]] > i):
84
+ d[c] = k
85
+ mx = max (cnt.values())
86
+ return [[c, ids[d[c]]] for c, x in cnt.items() if x == mx]
95
87
```
96
88
97
89
### ** Java**
@@ -101,31 +93,26 @@ class Solution:
101
93
``` java
102
94
class Solution {
103
95
public List<List<String > > mostPopularCreator (String [] creators , String [] ids , int [] views ) {
104
- Map<String , Integer > cnt = new HashMap<> ();
105
- Map<String , Integer > d = new HashMap<> ();
106
- Map<String , String > x = new HashMap<> ();
107
96
int n = ids. length;
97
+ Map<String , Long > cnt = new HashMap<> (n);
98
+ Map<String , Integer > d = new HashMap<> (n);
108
99
for (int k = 0 ; k < n; ++ k) {
109
- var c = creators[k];
110
- var i = ids[k];
111
- int v = views[k];
112
- cnt. put(c, cnt. getOrDefault(c, 0 ) + v);
113
- if (! d. containsKey(c) || d. get(c) < v || (d. get(c) == v && x. get(c). compareTo(i) > 0 )) {
114
- d. put(c, v);
115
- x. put(c, i);
100
+ String c = creators[k], i = ids[k];
101
+ long v = views[k];
102
+ cnt. merge(c, v, Long :: sum);
103
+ if (! d. containsKey(c) || views[d. get(c)] < v || (views[d. get(c)] == v && ids[d. get(c)]. compareTo(i) > 0 )) {
104
+ d. put(c, k);
116
105
}
117
106
}
107
+ long mx = 0 ;
108
+ for (long x : cnt. values()) {
109
+ mx = Math . max(mx, x);
110
+ }
118
111
List<List<String > > ans = new ArrayList<> ();
119
- int pre = - 1 ;
120
112
for (var e : cnt. entrySet()) {
121
- String a = e. getKey();
122
- int b = e. getValue();
123
- if (b > pre) {
124
- ans. clear();
125
- ans. add(Arrays . asList(a, x. get(a)));
126
- pre = b;
127
- } else if (b == pre) {
128
- ans. add(Arrays . asList(a, x. get(a)));
113
+ if (e. getValue() == mx) {
114
+ String c = e. getKey();
115
+ ans. add(List . of(c, ids[d. get(c)]));
129
116
}
130
117
}
131
118
return ans;
@@ -139,29 +126,25 @@ class Solution {
139
126
class Solution {
140
127
public:
141
128
vector<vector<string >> mostPopularCreator(vector<string >& creators, vector<string >& ids, vector<int >& views) {
142
- unordered_map<string, long> cnt;
129
+ unordered_map<string, long long > cnt;
143
130
unordered_map<string, int> d;
144
- unordered_map<string, string> x;
145
131
int n = ids.size();
146
132
for (int k = 0; k < n; ++k) {
147
- auto c = creators[ k] ;
148
- auto i = ids[ k] ;
133
+ auto c = creators[ k] , id = ids[ k] ;
149
134
int v = views[ k] ;
150
135
cnt[ c] += v;
151
- if (!d.count(c) || d[ c] < v || (d[ c] == v && x[ c] > i)) {
152
- d[ c] = v;
153
- x[ c] = i;
136
+ if (!d.count(c) || views[ d[ c]] < v || (views[ d[ c]] == v && ids[ d[ c]] > id)) {
137
+ d[ c] = k;
154
138
}
155
139
}
156
- long pre = -1;
140
+ long long mx = 0;
141
+ for (auto& [ _ , x] : cnt) {
142
+ mx = max(mx, x);
143
+ }
157
144
vector<vector<string >> ans;
158
- for (auto& [ a, b] : cnt) {
159
- if (b > pre) {
160
- ans.clear();
161
- ans.push_back({a, x[ a] });
162
- pre = b;
163
- } else if (b == pre) {
164
- ans.push_back({a, x[ a] });
145
+ for (auto& [ c, x] : cnt) {
146
+ if (x == mx) {
147
+ ans.push_back({c, ids[ d[ c]] });
165
148
}
166
149
}
167
150
return ans;
@@ -175,32 +158,59 @@ public:
175
158
func mostPopularCreator(creators []string, ids []string, views []int) (ans [][]string) {
176
159
cnt := map[string]int{}
177
160
d := map[string]int{}
178
- x := map[string]string{}
179
161
for k, c := range creators {
180
162
i, v := ids[k], views[k]
181
163
cnt[c] += v
182
- if t, ok := d[c]; !ok || t < v || (t == v && x[c] > i) {
183
- d[c] = v
184
- x[c] = i
164
+ if j, ok := d[c]; !ok || views[j] < v || (views[j] == v && ids[j] > i) {
165
+ d[c] = k
185
166
}
186
167
}
187
- pre := -1
188
- for a, b := range cnt {
189
- if b > pre {
190
- ans = [][]string{[]string{a, x[a]}}
191
- pre = b
192
- } else if b == pre {
193
- ans = append(ans, []string{a, x[a]})
168
+ mx := 0
169
+ for _, x := range cnt {
170
+ if mx < x {
171
+ mx = x
194
172
}
195
173
}
196
- return ans
174
+ for c, x := range cnt {
175
+ if x == mx {
176
+ ans = append(ans, []string{c, ids[d[c]]})
177
+ }
178
+ }
179
+ return
197
180
}
198
181
```
199
182
200
183
### ** TypeScript**
201
184
202
185
``` ts
203
-
186
+ function mostPopularCreator(
187
+ creators : string [],
188
+ ids : string [],
189
+ views : number [],
190
+ ): string [][] {
191
+ const cnt: Map <string , number > = new Map ();
192
+ const d: Map <string , number > = new Map ();
193
+ const n = ids .length ;
194
+ for (let k = 0 ; k < n ; ++ k ) {
195
+ const [c, i, v] = [creators [k ], ids [k ], views [k ]];
196
+ cnt .set (c , (cnt .get (c ) ?? 0 ) + v );
197
+ if (
198
+ ! d .has (c ) ||
199
+ views [d .get (c )! ] < v ||
200
+ (views [d .get (c )! ] === v && ids [d .get (c )! ] > i )
201
+ ) {
202
+ d .set (c , k );
203
+ }
204
+ }
205
+ const mx = Math .max (... cnt .values ());
206
+ const ans: string [][] = [];
207
+ for (const [c, x] of cnt ) {
208
+ if (x === mx ) {
209
+ ans .push ([c , ids [d .get (c )! ]]);
210
+ }
211
+ }
212
+ return ans ;
213
+ }
204
214
```
205
215
206
216
### ** ...**
0 commit comments