classSolution { public: intmaxFrequency(vector<int> &nums, int k, int numOperations) { int n = nums.size(); int i; int left_bound, right_bound; int max_val; int res = 0; unordered_map<int, int> umap; for (i = 0; i < n; i++) { umap[nums[i]]++; } std::sort(nums.begin(), nums.end()); nums.erase(std::unique(nums.begin(), nums.end()), nums.end()); n = nums.size(); for (i = 0; i < n; i++) { max_val = 0; left_bound = i - 1; while (left_bound >= 0 && nums[left_bound] >= nums[i] - k) { max_val += umap[left_bound]; left_bound--; }
right_bound = i + 1; while (right_bound < n && nums[right_bound] <= nums[i] + k) { max_val += umap[right_bound]; right_bound++; } if (max_val <= numOperations) { res = std::max(res, max_val + umap[nums[i]]); } else { res = std::max(res, numOperations + umap[nums[i]]); } } return res; } };
对于输入
1 2 3
nums = [5,64] k = 42 numOperations = 2
上面的代码是 WA 的,因为上面的代码只把最终频率最大的众数,我们称为目标众数的枚举范围只限定在 nums 中的值了。实际上,对于每个数都可以进行一次 operation,两个数如果都进行一次 operation 后相等也是符合要求的。
classSolution { public: intmaxFrequency(vector<int> &nums, int k, int numOperations) { int n = nums.size(); int i; int range_size; int res = 0; unordered_map<int, int> umap; for (i = 0; i < n; i++) { umap[nums[i]]++; } std::sort(nums.begin(), nums.end());
n = nums.size(); // 0 <= numOperations <= nums.length for (i = 0; i < n; i++) { for (int val : { nums[i] - k, nums[i], nums[i] + k }) { // 要枚举的值不在范围内 if (val < nums.front() || val > nums.back()) { // 如果val比nums最小值还小,没有意义,因为任何一个值能通过操作变成这个val,那么肯定也可以变成nums的最小值,那么为什么不用最小值作为目标众数呢? continue; } // range {x in nums[i] && x in {val-k..val+k}} range_size = std::upper_bound(nums.begin(), nums.end(), val + k) - std::lower_bound(nums.begin(), nums.end(), val - k);