难度:中等
提示
给你一个整数数组 nums 和两个整数 k 和 numOperations 。
你必须对 nums 执行 操作 numOperations 次。每次操作中,你可以:
- 选择一个下标
i,它在之前的操作中 没有 被选择过。 - 将
nums[i]增加范围[-k, k]中的一个整数。
在执行完所有操作以后,请你返回 nums 中出现 频率最高 元素的出现次数。
一个元素 x 的 频率 指的是它在数组中出现的次数。
示例 1:
**输入:**nums = [1,4,5], k = 1, numOperations = 2
**输出:**2
解释:
通过以下操作得到最高频率 2 :
- 将
nums[1]增加 0 ,nums变为[1, 4, 5]。 - 将
nums[2]增加 -1 ,nums变为[1, 4, 4]。
示例 2:
**输入:**nums = [5,11,20,20], k = 5, numOperations = 1
**输出:**2
解释:
通过以下操作得到最高频率 2 :
- 将
nums[1]增加 0 。
提示:
1 <= nums.length <= 10^51 <= nums[i] <= 10^50 <= k <= 10^50 <= numOperations <= nums.length
代码
cpp
#include <stdlib.h>
#include <string.h>
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
int lower_bound(int *arr, int size, int target) {
int left = 0, right = size;
while (left < right) {
int mid = left + (right - left) / 2;
if (arr[mid] < target) left = mid + 1;
else right = mid;
}
return left;
}
int upper_bound(int *arr, int size, int target) {
int left = 0, right = size;
while (left < right) {
int mid = left + (right - left) / 2;
if (arr[mid] <= target) left = mid + 1;
else right = mid;
}
return left;
}
int maxFrequency(int* nums, int numsSize, int k, int numOperations) {
if (numsSize == 0) return 0;
// 排序原始数组
int *sorted = (int *)malloc(numsSize * sizeof(int));
memcpy(sorted, nums, numsSize * sizeof(int));
qsort(sorted, numsSize, sizeof(int), compare);
// 统计原始频率 (值域: 1~100000)
int *freq = (int *)calloc(100001, sizeof(int));
for (int i = 0; i < numsSize; i++) {
if (nums[i] >= 1 && nums[i] <= 100000) freq[nums[i]]++;
}
// 生成候选值 v = {x, x-k, x+k}
int *candidates = (int *)malloc(3 * numsSize * sizeof(int));
int idx = 0;
for (int i = 0; i < numsSize; i++) {
candidates[idx++] = nums[i];
candidates[idx++] = nums[i] - k;
candidates[idx++] = nums[i] + k;
}
// 排序并去重候选值
int totalCandidates = idx;
qsort(candidates, totalCandidates, sizeof(int), compare);
int uniqueCandidates = 0;
for (int i = 0; i < totalCandidates; i++) {
if (i == 0 || candidates[i] != candidates[i - 1]) {
candidates[uniqueCandidates++] = candidates[i];
}
}
int best = 0;
for (int i = 0; i < uniqueCandidates; i++) {
int v = candidates[i];
int low = v - k;
int high = v + k;
// 计算区间 [v-k, v+k] 内的元素数量
int left_idx = lower_bound(sorted, numsSize, low);
int right_idx = upper_bound(sorted, numsSize, high);
int C_v = right_idx - left_idx;
int candidate;
if (v >= 1 && v <= 100000 && freq[v] > 0) {
candidate = (C_v < freq[v] + numOperations) ? C_v : (freq[v] + numOperations);
} else {
candidate = (C_v < numOperations) ? C_v : numOperations;
}
if (candidate > best) best = candidate;
}
free(sorted);
free(freq);
free(candidates);
return best;
}