leetcode 1838. 最高频元素的频数

本文介绍如何通过排序和滑动窗口算法解决给定整数数组nums和整数k的问题,目标是在k次操作后找到最高频元素的最大可能频数。实例演示了如何应用这一思路来优化数组元素分布并求解最优解。

元素的 频数 是该元素在一个数组中出现的次数。

给你一个整数数组 nums 和一个整数 k 。在一步操作中,你可以选择 nums 的一个下标,并将该下标对应元素的值增加 1 。

执行最多 k 次操作后,返回数组中最高频元素的 最大可能频数 。

最高频元素的频数

示例 1:

输入:nums = [1,2,4], k = 5
输出:3
解释:对第一个元素执行 3 次递增操作,对第二个元素执 2 次递增操作,此时 nums = [4,4,4] 。
4 是数组中最高频元素,频数是 3 。

示例 2:

输入:nums = [1,4,8,13], k = 5
输出:2
解释:存在多种最优解决方案
对第一个元素执行 3 次递增操作,此时 nums = [4,4,8,13] 。4 是数组中最高频元素,频数是 2 。
对第二个元素执行 4 次递增操作,此时 nums = [1,8,8,13] 。8 是数组中最高频元素,频数是 2 。
对第三个元素执行 5 次递增操作,此时 nums = [1,4,13,13] 。13 是数组中最高频元素,频数是 2 。

示例 3:

输入:nums = [3,9,6], k = 2
输出:1

提示:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5
  • 1 <= k <= 10^5

思路:排序+双指针(滑动窗口思想)
1、从小到大排序
2、排序过后,从小到大,逐次上升,想象成具有层次感的一排树木,如果想要一个区间 [ l, r ] 之间的数全部变为 nums[ r ], 首先求这些元素的和 sum, 那么需要+1的次数就 = 全部变为nums[ r ]之后的总和 - 改变之前的总和,即nums[ r ] * ( r - l + 1) - sum, 如果这个结果 <= k ,窗口扩大,r + 1;否则,窗口缩小,l + 1,更新 sum.

class Solution {
public:
    int maxFrequency(vector<int>& nums, int k) {
        int n = nums.size();
        if(n == 1) return 1;
        sort(nums.begin(), nums.end()); 
        int l = 0;     //左指针
        int r = 1;     //右指针
        //注意变量类型
        long long sum = nums[0];
        int res = 1;
        while(r < n){
            sum += nums[r];
            if((long long)(r - l + 1) * nums[r] - sum <= k){
                res = max(res, r - l + 1);
            }
            else{
                sum -= nums[l];
                l++;
            }
            r++;
        }
        return res;
    }
};
第一章 计算机体系结构的基本概念1.1 引论1.2 计算机体系结构的概念1.2.1 计算机系统中的层次概念1.2.2 计算机体系结构1.2.3 计算机组成和计算机实现技术1.3 计算机体系结构的发展1.3.1 存储程序计算机体系结构及其发展1.3.2 计算机的分代和分型1.3.3 应用需求的发展1.3.4 计算机实现技术的发展1.3. 5 体系结构的生命周期1.4 计算机体系结构中并行性的发展1.4.1并行性概念1.4.2 提高并行性的技术途径1.5 定量分析技术基础1.5.1 计算机性能的评测1.5.2 测试程序1.5.3 性能设计和评测的基本原则1.5.4 CPU的性能1.6 影响计算机体系结构的成本和价格因素1.6.1 集成电路的成本1.6.2 计算机系统的成本和价格1.7 小结习题一第二章 计算机指令集结构设计2.1 指令集结构的分类2.1.1 指令集结构的分类2.1.2 通用寄存器型指令集结构分类2.2 寻址技术2.3 指令集结构的功能设计2.3.1 CISC计算机指令集结构的功能设计2.3.2 RISC计算机指令集结构的功能设计2.3.3 控制指令2.4 操作数的类型、表示和大小2.5 指令集格式的设计2.5.1 寻址方式的表示方法2.5.2 指令集格式的选择2.6 编译技术与计算机体系结构设计2.6.1 现代编译器的结构和相关技术2.6.2 现代编译技术对计算机体系结构设计的影响2.6.3 计算机体系结构对当前编译技术的影响2.7 DLX指令集结构2.7.1 DLX指令集结构2.7.2 DLX指令集结构效能分析2.8 小结习题二第三章 流水线技术3.1 流水线的基本概念3.1.1 流水线的基本概念3.1.2 流水线的分类3.2 DLX的基本流水线3.2.1 DLX的一种简单实现3.2.2 基本的DLX流水线3.2.3 流水线性能分析3. 3 流水线中的相关3.3.1 流水线的结构相关3.3.2 流水线的数据相关3.3.3 流水线的控制相关3.4 流水线计算机实例分析(MIPS R4000)3.4.1 MIPS R4000整型流水线3.4.2 MIPS R4000浮点流水线3.4.3 MIPS R4000流水线的性能分析3.5 向量处理机3.5.1 向量处理方式和向量处理机3.5.2 向量处理机实例分析3.6 小结习题三第四章 指令级并行4.1 指令级并行的概念4.1.1 循环展开调度的基本方法4.1.2 相关性4.2 指令的动态调度4.2.1 动态调度的原理4.2.2 动态调度算法之一:记分牌4.2.3 动态调度算法之二:Tomasulo算法4.3 控制相关的动态解决技术4.3.1 减少分支延迟:分支预测缓冲技术4.3.2 进一步减少分支延迟:分支目标缓冲4.3.3 基于硬件的推断执行4.4 多指令流出技术4.4.1 超标量技术4.4.2 多指令流出的动态调度4.4.3 超长指令字技术4.4.4 多流出处理器受到的限制4.5 小结习题四第五章 存储层次5.1 存储器的层次结构5.1.1 从单级存储器到多级存储器5.1.2 存储层次的性能参数5.1.3 “Cache—主存”和“主存—辅存”层次5.1.4 存储层次的四个问题5.2 Cache基本知识5.2.1 映象规则5.2.2 查找方法5.2.3 替换算法5.2.4 写策略5.2.5 Cache的结构5.2.6 Cache性能分析5.2.7 改进Cache性能5.3 降低Cache失效率的方法5.3.1 增加Cache块大小5.3.2 提高相联度5.3.3 Victim Cache5.3.4 伪相联Cache5.3.5 硬件预取技术5.3.6 由编译器控制的预取5.3.7 编译器优化5.4 减少Cache失效开销5.4.1 让读失效优先于写5.4.2 子块放置技术5.4.3 请求字处理技术5.4.4 非阻塞Cache技术5.4.5 采用两级Cache5.5 减少命中时间5.5.1 容量小,结构简单的Cache5.5.2 虚拟Cache5.5.3 写操作流水化5.5.4 Cache优化技术小结5.6 主存5.6.1 存储器技术5.6.2 提高主存性能的存储器组织结构5.7 虚拟存储器5.7.1 虚拟存储器基本原理5.7.2 快表(TLB)5.7.3 页面大小的选择5.8 进程保护和虚存实例5.8.1 进程保护5.8.2 页式虚存举例:Alpha AXP的存储管理和21064的TLB5.9 Alpha AXP 21064存储层次5.10 小结习题五第六章 输入输出系统6.1 概述6.2 存储设备6.2.1 磁盘设备6.2.2 磁带设备6.2.3 光盘设备6.3 总线6.3.1 总线分类6.3.2 总线基本工作原理6.3.3 总线使用6.3.4 总线标准和实例6.3.5 设备的连接6.3.6 CPU与I/O处理的匹配6.4 通道处理机6.4.1 通道的作用和功能6.4.2 通道的工作过程6.4.3 通道种类6.4.4 通道中的数据传送过程6.4.5 通道的流量分析6.5 I/O与操作系统6.5.1 I/O和Cache数据一致性6.5.2 DMA和虚拟存储器6.6 I/O系统设计6.7 小结习题六第七章 多处理机7.1 引言7.1.1 并行计算机体系结构的分类7.1.2 通信模型和存储器的结构模型7.1.3 通信机制的性能7.1.4 不同通信机制的优点7.1.5 并行处理面临的挑战7.1.6 并行程序的计算/通信比率7.2 多处理机的存储器体系结构7.2.1 集中式共享存储器体系结构7.2.2 分布式共享存储器体系结构7.3 互连网络7.3.1 互连网络的性能参数7.3.2 静态连接网络7.3.3 动态连接网络7.4 同步与通信7.4.1 同步机制7.4.2 大规模机器的同步7.5 并行化技术7.5.1 并行化的基本策略7.5.2 并行语育与编译器7.6 多处理机实例7.6.1 Challenge多处理机系统7.6.2 Origin 20007.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值