leetcode2968 执行操作使频率分数最大
给定长度为n的数组nums和整数k,可以对数组执行至多k次操作,每次选择1个nums[i],将其增加或减少1,最终数组的频率分数定义为数组众数的频率,求可以得到的最大频率分数。
1<=n<=1E5; 1<=nums[i]<=1E9; 0<=k<=1E14
分析:
(1)中位数贪心:对于有序数组,如果所有元素都变成相同的数,最优做法是全部变成中位数。如果个数为偶数,则变成中间两数或者该两数之间任意整数,结果是一样的。
(2)前缀和快速求和,前半部分是负的,后半部分是正的,分开算。
(3)对原数组排序,然后滑动窗口维护可行的子数组,更新答案。
class Solution { public: int maxFrequencyScore(vector<int>& nums, long long k) { std::sort(nums.begin(), nums.end()); int n = nums.size(); std::vector<long long> pre(n); pre[0] = nums[0]; for (int i = 1; i < n; i++) { pre[i] = pre[i - 1] + nums[i]; } auto sum = [&](int l, int r) { l = std::max(l, 0); r = std::min(r, n - 1); return l ? pre[r] - pre[l - 1] : pre[r]; }; auto get = [&](int l, int r) { int m = (l + r) / 2; int L = m - l + 1; int R = r - m; return 1LL * (L - R) * nums[m] - sum(l, m) + sum(m + 1, r); }; int ans = 0; for (int l = 0, r = 0; r < n; r++) { while (get(l, r) > k) { l += 1; } ans = std::max(ans, r - l + 1); } return ans; } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义