算法笔试模拟题精解之“调整数组”

简介: 首先理解题意:经过k次操作后能出现次数最多的元素, 以及这个元素的最小值;然后将示例仔细分析一下,就可以找到解题的方法了。

在线编程介绍

阿里云开发者社区在线编程产品,针对广大开发者学习、实践、面试、应聘、考试认证等打造的免费在线刷题神器。题库来自笔试模拟题、算法大赛模拟题等,界面整洁明了,操作简单,为用户营造专心答题的学习环境。点击链接开始体验:https://developer.aliyun.com/coding

本文为大家介绍其中的 第89题:调整数组 的题目解析,具体如下:

题目描述

等级:中等
知识点:尺取法

查看题目:调整数组
A同学有一个长度为n的数组,对于这个数组,他能够进行k次如下操作:任选数组中的某个元素将其数值加一(一个元素可以被加多次)。
他想在操作不超过k次的情况下,使得数组中某一元素的出现次数尽可能的多,并同时使这个元素尽可能的小。
请你找出出现次数最多的元素的出现次数以及此时这个元素的最小值。

输入:
输入数组长度n(1 <= n <= 10^5),最多能操作次数k(1 <= k <= 10^5),和一个包含n个数的数组,数组中第i个元素的值为ai(0 <= ai <= 10^4)。

输出:
输出操作后出现次数最多的元素的出现次数以及此时这个元素的最小值。

解题方法:模拟法

变量概述

  • int n : 有n个数
  • int k : 最多操作k次
  • int[] a : 存储n个数的数组
  • 只能对a[i]进行一种操作 : +1

首先理解题意:经过k次操作后能出现次数最多的元素, 以及这个元素的最小值;
示例说明:

  • 1 2 2 3 3 4

两个3要变成4就得操作2次
两个2要变成4就得操作4次

  • 因为 ai 的大小被限定在[0, 10^4], 所以可以使用一个数组arr, 来统计每个数字出现的次数。
  • 遍历数组arr, 对于任意不等于0的数arr[i], 逆向遍历前面所有*不为0的***arr[j]**, 并对每个不为0的arr[j], **k-=arr[j] * (i-j)**, 直到k不够减或没前面没数字了。
  • 如果是k不够减, 则得在判断k能够再减去多少个arr[j], 因为之前的公式是计算减去所有的arr[j]的
  • 之所以要不为0的, 是因为压根没有这个数, 无法对其进行+操作

解题步骤

1、定义变量

  • int[] arr : 用来存储每个数字出现的次数, 容量为10001
  • int max : 用来存储最大次数, 初始化为1
  • int maxValue : 用来存储最大次数所对应的最小值, 随着最大次数的更新而更新, 初始化为a[0]
  • int k1 : 用来备份k值, 避免k值计算后不见了
  • int temp : 用来统计当前最大数字出现的次数, 初始化为arr[i]

2、遍历数组arr, 找出出现最多的次数以及对应的最小值.

  • 对于每个arr[j] 如果arr[j]为0, 则直接跳过. 不是不加,而是没法加
  • 如果arr[j] * (i-j) <= k, 证明当前的操作次数能够将j全部变成i, 则使用temp加上所有的j
  • 如果arr[j] * (i-j) > k, 则证明当前次数k无法将全部j变成i,开始尝试将部分j转成i

    • 使用k/(i-j)计算还能够将多少个j转成i,然后进行转换
    • 判断temp和最大值是否大于最大次数max, 如果大于, 则更新max和maxValue
  • 注意: 当arr[j]顺利遍历到arr[0]时退出循环, 因为我们的比较最大值操作是在循环内进行的, 所以此时, 可能无法对max进行更新, 因此需要在手动判断一次temp和max的大小

3、返回数组

时间复杂度: O(n^2)
空间复杂度: O(n)

看完之后是不是有了想法了呢,快来练练手吧>>查看题目:调整数组

720-150.png

相关文章
|
9天前
|
存储 监控 算法
关于员工上网监控系统中 PHP 关联数组算法的学术解析
在当代企业管理中,员工上网监控系统是维护信息安全和提升工作效率的关键工具。PHP 中的关联数组凭借其灵活的键值对存储方式,在记录员工网络活动、管理访问规则及分析上网行为等方面发挥重要作用。通过关联数组,系统能高效记录每位员工的上网历史,设定网站访问权限,并统计不同类型的网站访问频率,帮助企业洞察员工上网模式,发现潜在问题并采取相应管理措施,从而保障信息安全和提高工作效率。
28 7
|
1月前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
76 23
|
5月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
64 0
|
5月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
87 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
5月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
60 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
4天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于生物地理算法的MLP多层感知机优化matlab仿真
本程序基于生物地理算法(BBO)优化MLP多层感知机,通过MATLAB2022A实现随机数据点的趋势预测,并输出优化收敛曲线。BBO模拟物种在地理空间上的迁移、竞争与适应过程,以优化MLP的权重和偏置参数,提升预测性能。完整程序无水印,适用于机器学习和数据预测任务。
|
3天前
|
资源调度 算法 数据可视化
基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF
本项目基于MATLAB2022A实现IEKF迭代扩展卡尔曼滤波算法的数据跟踪仿真,对比EKF和UKF的性能。通过仿真输出误差收敛曲线和误差协方差收敛曲线,展示三种滤波器的精度差异。核心程序包括数据处理、误差计算及可视化展示。IEKF通过多次迭代线性化过程,增强非线性处理能力;UKF避免线性化,使用sigma点直接处理非线性问题;EKF则通过一次线性化简化处理。
|
5天前
|
算法 数据安全/隐私保护
基于二次规划优化的OFDM系统PAPR抑制算法的matlab仿真
本程序基于二次规划优化的OFDM系统PAPR抑制算法,旨在降低OFDM信号的高峰均功率比(PAPR),以减少射频放大器的非线性失真并提高电源效率。通过MATLAB2022A仿真验证,核心算法通过对原始OFDM信号进行预编码,最小化最大瞬时功率,同时约束信号重构误差,确保数据完整性。完整程序运行后无水印,展示优化后的PAPR性能提升效果。
|
8天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-LSTM-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-LSTM-SAM网络时间序列预测算法。使用Matlab2022a开发,完整代码含中文注释及操作视频。算法结合卷积层提取局部特征、LSTM处理长期依赖、自注意力机制捕捉全局特征,通过粒子群优化提升预测精度。适用于金融市场、气象预报等领域,提供高效准确的预测结果。
|
2天前
|
算法 数据安全/隐私保护 计算机视觉
基于sift变换的农田杂草匹配定位算法matlab仿真
本项目基于SIFT算法实现农田杂草精准识别与定位,运行环境为Matlab2022a。完整程序无水印,提供详细中文注释及操作视频。核心步骤包括尺度空间极值检测、关键点定位、方向分配和特征描述符生成。该算法通过特征匹配实现杂草定位,适用于现代农业中的自动化防控。

热门文章

最新文章