Skip to content

Commit 5092222

Browse files
committed
feat: add solutions to lc problem: No.1838
No.1838.Frequency of the Most Frequent Element
1 parent 5299f47 commit 5092222

File tree

5 files changed

+217
-48
lines changed

5 files changed

+217
-48
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
</p>
44

55
<p align="center">
6-
<a href="https://github.com/doocs/leetcode"><img src="https://img.shields.io/badge/langs-Java%20%7C%20Python%20%7C%20C%2B%2B%20%7C%20JavaScript%20%7C%20Go%20%7C%20...-red?style=flat-square&color=42b883" alt="languages"></a>
6+
<a href="https://github.com/doocs/leetcode"><img src="https://img.shields.io/badge/langs-Java%20%7C%20Python%20%7C%20C%2B%2B%20%7C%20Go%20%7C%20TypeScript%20%7C%20...-red?style=flat-square&color=42b883" alt="languages"></a>
77
<a href="https://doocs.github.io/#/?id=how-to-join"><img src="https://img.shields.io/badge/organization-join%20us-42b883?style=flat-square" alt="open-source-organization"></a>
88
<a href="https://github.com/doocs/leetcode/blob/main/LICENSE"><img src="https://img.shields.io/github/license/doocs/leetcode?color=42b883&style=flat-square" alt="LICENSE"></a><br>
99
<a href="https://opencollective.com/doocs-leetcode/backers/badge.svg" alt="backers on Open Collective"><img src="https://img.shields.io/opencollective/backers/doocs-leetcode?color=42b883&style=flat-square&logo=open%20collective&logoColor=ffffff" /></a>

README_EN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
</p>
44

55
<p align="center">
6-
<a href="https://github.com/doocs/leetcode"><img src="https://img.shields.io/badge/langs-Java%20%7C%20Python%20%7C%20C%2B%2B%20%7C%20JavaScript%20%7C%20Go%20%7C%20...-red?style=flat-square&color=42b883" alt="languages"></a>
6+
<a href="https://github.com/doocs/leetcode"><img src="https://img.shields.io/badge/langs-Java%20%7C%20Python%20%7C%20C%2B%2B%20%7C%20Go%20%7C%20TypeScript%20%7C%20...-red?style=flat-square&color=42b883" alt="languages"></a>
77
<a href="https://doocs.github.io/#/?id=how-to-join"><img src="https://img.shields.io/badge/organization-join%20us-42b883?style=flat-square" alt="open-source-organization"></a>
88
<a href="https://github.com/doocs/leetcode/blob/main/LICENSE"><img src="https://img.shields.io/github/license/doocs/leetcode?color=42b883&style=flat-square" alt="LICENSE"></a><br>
99
<a href="https://opencollective.com/doocs-leetcode/backers/badge.svg" alt="backers on Open Collective"><img src="https://img.shields.io/opencollective/backers/doocs-leetcode?color=42b883&style=flat-square&logo=open%20collective&logoColor=ffffff" /></a>

solution/1800-1899/1838.Frequency of the Most Frequent Element/README.md

Lines changed: 94 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,15 @@
5454

5555
<!-- 这里可写通用的实现逻辑 -->
5656

57+
**方法一:排序 + 滑动窗口**
58+
5759
排序后,用滑动窗口维护下标 `l``r` 的数都增加到 `nums[r]` 的操作次数。
5860

59-
也可以先排序,计算前缀和,然后二分枚举频数,找到符合条件的最大值。
61+
**方法二:排序 + 前缀和 + 二分查找**
62+
63+
对 nums 排序,计算前缀和,然后二分枚举频数 cnt,找到符合条件的最大值。
64+
65+
> 注意题目里,每个数在一次操作中只能增加 1,而不能减 1。
6066
6167
<!-- tabs:start -->
6268

@@ -86,19 +92,16 @@ class Solution:
8692
```python
8793
class Solution:
8894
def maxFrequency(self, nums: List[int], k: int) -> int:
89-
nums.sort()
90-
n = len(nums)
91-
presum = [0] * (n + 1)
92-
for i in range(1, n + 1):
93-
presum[i] = presum[i - 1] + nums[i - 1]
94-
95-
def check(count):
96-
for i in range(n - count + 1):
97-
j = i + count - 1
98-
if nums[j] * count - (presum[j + 1] - presum[i]) <= k:
95+
def check(cnt):
96+
for i in range(n):
97+
j = i + cnt - 1
98+
if j < n and nums[j] * cnt - (s[j + 1] - s[i]) <= k:
9999
return True
100100
return False
101101

102+
nums.sort()
103+
n = len(nums)
104+
s = [0] + list(accumulate(nums))
102105
left, right = 1, n
103106
while left < right:
104107
mid = (left + right + 1) >> 1
@@ -137,20 +140,20 @@ class Solution {
137140

138141
```java
139142
class Solution {
140-
private int[] nums;
141-
private int k;
142143
private int n;
143-
private int[] presum;
144+
private int k;
145+
private int[] nums;
146+
private long[] presum;
144147

145148
public int maxFrequency(int[] nums, int k) {
146149
Arrays.sort(nums);
147-
this.nums = nums;
148-
this.k = k;
149150
n = nums.length;
150-
presum = new int[n + 1];
151-
for (int i = 1; i <= n; ++i) {
152-
presum[i] = presum[i - 1] + nums[i - 1];
151+
presum = new long[n + 1];
152+
for (int i = 0; i < n; ++i) {
153+
presum[i + 1] = presum[i] + nums[i];
153154
}
155+
this.k = k;
156+
this.nums = nums;
154157
int left = 1, right = n;
155158
while (left < right) {
156159
int mid = (left + right + 1) >> 1;
@@ -163,10 +166,10 @@ class Solution {
163166
return left;
164167
}
165168

166-
private boolean check(int count) {
167-
for (int i = 0; i < n - count + 1; ++i) {
168-
int j = i + count - 1;
169-
if (nums[j] * count - (presum[j + 1] - presum[i]) <= k) {
169+
private boolean check(int cnt) {
170+
for (int i = 0; i < n; ++i) {
171+
int j = i + cnt - 1;
172+
if (j < n && (long) nums[j] * cnt - (presum[j + 1] - presum[i]) <= k) {
170173
return true;
171174
}
172175
}
@@ -203,6 +206,36 @@ func max(x, y int) int {
203206
}
204207
```
205208

209+
```go
210+
func maxFrequency(nums []int, k int) int {
211+
sort.Ints(nums)
212+
n := len(nums)
213+
s := make([]int, n+1)
214+
for i, v := range nums {
215+
s[i+1] = s[i] + v
216+
}
217+
check := func(cnt int) bool {
218+
for i := 0; i < n; i++ {
219+
j := i + cnt - 1
220+
if j < n && nums[j]*cnt-(s[j+1]-s[i]) <= k {
221+
return true
222+
}
223+
}
224+
return false
225+
}
226+
left, right := 1, n
227+
for left < right {
228+
mid := (left + right + 1) >> 1
229+
if check(mid) {
230+
left = mid
231+
} else {
232+
right = mid - 1
233+
}
234+
}
235+
return left
236+
}
237+
```
238+
206239
### **C++**
207240

208241
```cpp
@@ -241,6 +274,44 @@ public:
241274
};
242275
```
243276

277+
### **JavaScript**
278+
279+
```js
280+
/**
281+
* @param {number[]} nums
282+
* @param {number} k
283+
* @return {number}
284+
*/
285+
var maxFrequency = function (nums, k) {
286+
nums.sort((a, b) => a - b);
287+
const n = nums.length;
288+
let s = new Array(n + 1).fill(0);
289+
for (let i = 0; i < n; ++i) {
290+
s[i + 1] = s[i] + nums[i];
291+
}
292+
function check(cnt) {
293+
for (let i = 0; i < n; ++i) {
294+
const j = i + cnt - 1;
295+
if (j < n && nums[j] * cnt - (s[j + 1] - s[i]) <= k) {
296+
return true;
297+
}
298+
}
299+
return false;
300+
}
301+
let left = 1,
302+
right = n;
303+
while (left < right) {
304+
const mid = (left + right + 1) >> 1;
305+
if (check(mid)) {
306+
left = mid;
307+
} else {
308+
right = mid - 1;
309+
}
310+
}
311+
return left;
312+
};
313+
```
314+
244315
### **...**
245316

246317
```

solution/1800-1899/1838.Frequency of the Most Frequent Element/README_EN.md

Lines changed: 88 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -72,19 +72,16 @@ class Solution:
7272
```python
7373
class Solution:
7474
def maxFrequency(self, nums: List[int], k: int) -> int:
75-
nums.sort()
76-
n = len(nums)
77-
presum = [0] * (n + 1)
78-
for i in range(1, n + 1):
79-
presum[i] = presum[i - 1] + nums[i - 1]
80-
81-
def check(count):
82-
for i in range(n - count + 1):
83-
j = i + count - 1
84-
if nums[j] * count - (presum[j + 1] - presum[i]) <= k:
75+
def check(cnt):
76+
for i in range(n):
77+
j = i + cnt - 1
78+
if j < n and nums[j] * cnt - (s[j + 1] - s[i]) <= k:
8579
return True
8680
return False
87-
81+
82+
nums.sort()
83+
n = len(nums)
84+
s = [0] + list(accumulate(nums))
8885
left, right = 1, n
8986
while left < right:
9087
mid = (left + right + 1) >> 1
@@ -119,20 +116,20 @@ class Solution {
119116

120117
```java
121118
class Solution {
122-
private int[] nums;
123-
private int k;
124119
private int n;
125-
private int[] presum;
120+
private int k;
121+
private int[] nums;
122+
private long[] presum;
126123

127124
public int maxFrequency(int[] nums, int k) {
128125
Arrays.sort(nums);
129-
this.nums = nums;
130-
this.k = k;
131126
n = nums.length;
132-
presum = new int[n + 1];
133-
for (int i = 1; i <= n; ++i) {
134-
presum[i] = presum[i - 1] + nums[i - 1];
127+
presum = new long[n + 1];
128+
for (int i = 0; i < n; ++i) {
129+
presum[i + 1] = presum[i] + nums[i];
135130
}
131+
this.k = k;
132+
this.nums = nums;
136133
int left = 1, right = n;
137134
while (left < right) {
138135
int mid = (left + right + 1) >> 1;
@@ -145,10 +142,10 @@ class Solution {
145142
return left;
146143
}
147144

148-
private boolean check(int count) {
149-
for (int i = 0; i < n - count + 1; ++i) {
150-
int j = i + count - 1;
151-
if (nums[j] * count - (presum[j + 1] - presum[i]) <= k) {
145+
private boolean check(int cnt) {
146+
for (int i = 0; i < n; ++i) {
147+
int j = i + cnt - 1;
148+
if (j < n && (long) nums[j] * cnt - (presum[j + 1] - presum[i]) <= k) {
152149
return true;
153150
}
154151
}
@@ -185,6 +182,36 @@ func max(x, y int) int {
185182
}
186183
```
187184

185+
```go
186+
func maxFrequency(nums []int, k int) int {
187+
sort.Ints(nums)
188+
n := len(nums)
189+
s := make([]int, n+1)
190+
for i, v := range nums {
191+
s[i+1] = s[i] + v
192+
}
193+
check := func(cnt int) bool {
194+
for i := 0; i < n; i++ {
195+
j := i + cnt - 1
196+
if j < n && nums[j]*cnt-(s[j+1]-s[i]) <= k {
197+
return true
198+
}
199+
}
200+
return false
201+
}
202+
left, right := 1, n
203+
for left < right {
204+
mid := (left + right + 1) >> 1
205+
if check(mid) {
206+
left = mid
207+
} else {
208+
right = mid - 1
209+
}
210+
}
211+
return left
212+
}
213+
```
214+
188215
### **C++**
189216

190217
```cpp
@@ -223,6 +250,44 @@ public:
223250
};
224251
```
225252

253+
### **JavaScript**
254+
255+
```js
256+
/**
257+
* @param {number[]} nums
258+
* @param {number} k
259+
* @return {number}
260+
*/
261+
var maxFrequency = function (nums, k) {
262+
nums.sort((a, b) => a - b);
263+
const n = nums.length;
264+
let s = new Array(n + 1).fill(0);
265+
for (let i = 0; i < n; ++i) {
266+
s[i + 1] = s[i] + nums[i];
267+
}
268+
function check(cnt) {
269+
for (let i = 0; i < n; ++i) {
270+
const j = i + cnt - 1;
271+
if (j < n && nums[j] * cnt - (s[j + 1] - s[i]) <= k) {
272+
return true;
273+
}
274+
}
275+
return false;
276+
}
277+
let left = 1,
278+
right = n;
279+
while (left < right) {
280+
const mid = (left + right + 1) >> 1;
281+
if (check(mid)) {
282+
left = mid;
283+
} else {
284+
right = mid - 1;
285+
}
286+
}
287+
return left;
288+
};
289+
```
290+
226291
### **...**
227292

228293
```
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* @param {number[]} nums
3+
* @param {number} k
4+
* @return {number}
5+
*/
6+
var maxFrequency = function (nums, k) {
7+
nums.sort((a, b) => a - b);
8+
const n = nums.length;
9+
let s = new Array(n + 1).fill(0);
10+
for (let i = 0; i < n; ++i) {
11+
s[i + 1] = s[i] + nums[i];
12+
}
13+
function check(cnt) {
14+
for (let i = 0; i < n; ++i) {
15+
const j = i + cnt - 1;
16+
if (j < n && nums[j] * cnt - (s[j + 1] - s[i]) <= k) {
17+
return true;
18+
}
19+
}
20+
return false;
21+
}
22+
let left = 1,
23+
right = n;
24+
while (left < right) {
25+
const mid = (left + right + 1) >> 1;
26+
if (check(mid)) {
27+
left = mid;
28+
} else {
29+
right = mid - 1;
30+
}
31+
}
32+
return left;
33+
};

0 commit comments

Comments
 (0)