Skip to content

Commit 05eaeb0

Browse files
Create 1838. 最高频元素的频数.md
1 parent e3b22c6 commit 05eaeb0

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#### 1838. 最高频元素的频数
2+
3+
难度:中等
4+
5+
---
6+
7+
元素的 **频数** 是该元素在一个数组中出现的次数。
8+
9+
给你一个整数数组 `nums` 和一个整数 `k` 。在一步操作中,你可以选择 `nums` 的一个下标,并将该下标对应元素的值增加 `1`
10+
11+
执行最多 `k` 次操作后,返回数组中最高频元素的 **最大可能频数** __
12+
13+
**示例 1:**
14+
15+
```
16+
输入:nums = [1,2,4], k = 5
17+
输出:3
18+
解释:对第一个元素执行 3 次递增操作,对第二个元素执 2 次递增操作,此时 nums = [4,4,4] 。
19+
4 是数组中最高频元素,频数是 3 。
20+
```
21+
22+
**示例 2:**
23+
24+
```
25+
输入:nums = [1,4,8,13], k = 5
26+
输出:2
27+
解释:存在多种最优解决方案:
28+
- 对第一个元素执行 3 次递增操作,此时 nums = [4,4,8,13] 。4 是数组中最高频元素,频数是 2 。
29+
- 对第二个元素执行 4 次递增操作,此时 nums = [1,8,8,13] 。8 是数组中最高频元素,频数是 2 。
30+
- 对第三个元素执行 5 次递增操作,此时 nums = [1,4,13,13] 。13 是数组中最高频元素,频数是 2 。
31+
```
32+
33+
**示例 3:**
34+
35+
```
36+
输入:nums = [3,9,6], k = 2
37+
输出:1
38+
```
39+
40+
**提示:**
41+
42+
* `1 <= nums.length <= 10^5`
43+
* `1 <= nums[i] <= 10^5`
44+
* `1 <= k <= 10^5`
45+
46+
---
47+
48+
滑动窗口:
49+
50+
题目类似于补全两个下标之间的数以到达同一水平线,窗口内记录补全需要的总数,如果总数大于 `k`,则左下标向右移动,否则右下标继续向右移动。
51+
52+
```Go
53+
func maxFrequency(nums []int, k int) int {
54+
sort.Ints(nums)
55+
ans := 1
56+
for left, right, total := 0, 1, 0; right < len(nums); right ++ {
57+
total += (nums[right] - nums[right -1]) * (right - left)
58+
if total > k {
59+
total -= nums[right] - nums[left]
60+
left++
61+
}
62+
ans = max(ans, right - left + 1)
63+
}
64+
return ans
65+
}
66+
67+
func max(num1, num2 int) int {
68+
if num1 > num2 {
69+
return num1
70+
}
71+
return num2
72+
}
73+
```

0 commit comments

Comments
 (0)