java数组题(5)

(1):

 思路:

1.首先要对数组nums排序,这样两数之间的差距最小。

2.题目要求我们通过最多 k 次递增操作,使数组中某个元素的频数(出现次数)最大化。经过上面的排序,最大数组也就是在整个数组里的某一截。使用滑动窗口

3.初始化两个指针 left 和 right,分别表示滑动窗口的左右边界,假设我们获得了一截数组是我们想要的,怎么证明呢?判断条件是什么?

4. 要最大可能频数,先定义一个maxF来表示最高频元素的最大可能频数。可以通过Math.max来获得最大频数。

5.做一个假设,在窗口里的数字都变成最高元素(也就是right指针所在)。那么n个元素*最高元素=MaxSum,这个最大总和减去实际n个元素的总和的值(MaxSum-Sum=x),要是大于k就说明在这个滑动窗口里,数据太多,k达不到最高频元素的最大可能频数。左指针++。同时更新 sum,直到 sum 不大于 k更新 maxF

6.返回 maxF

代码:

import java.util.Arrays;public class Solution {public int maxFrequency(int[] nums, int k) {Arrays.sort(nums);int left = 0;long sum = 0;int maxFreq = 0;for (int right = 0; right < nums.length; right++) {sum += nums[right];while ((long) nums[right] * (right - left + 1) - sum > k) {sum -= nums[left];left++;}maxFreq = Math.max(maxFreq, right - left + 1);}return maxFreq;}
}

代码解释:

  1. 排序数组:首先对数组进行排序,以便后续使用滑动窗口。
  2. 初始化变量
    • left:滑动窗口的左边界
    • sum:窗口内所有元素的和(使用long避免整数溢出)
    • maxF:记录最大频数
  3. 滑动窗口遍历
    • 右指针right从 0 开始遍历数组
    • 每次将当前元素加入窗口,并更新窗口和sum
    • 检查当前窗口是否满足条件:nums[right] * (right - left + 1) - sum <= k
      • 如果不满足,则缩小窗口左边界left,并更新窗口和sum
    • 更新最大频数maxF
  4. 返回结果:遍历结束后返回最大频数。

复杂度分析:

  • 时间复杂度:O (n log n)(排序) + O (n)(滑动窗口遍历)= O (n log n)
  • 空间复杂度:O (1)(仅使用常数额外空间

(2): 

 思路:

我们需要通过重新排列数组元素并减小它们的值,使得数组的第一个元素为 1,且相邻元素的差的绝对值不超过 1,同时最大化数组中的最大值。关键在于构造一个从 1 开始的递增序列,每个元素尽可能比前一个大 1,因为这样可以得到最大的可能值

  1. 排序数组:首先将数组排序,以便后续处理。
  2. 贪心构造递增序列:从 1 开始,依次尝试构造下一个数(当前数 + 1),只要数组中存在至少一个元素大于等于当前需要构造的数,就可以使用该元素来构造,并继续构造下一个更大的数。

代码:

import java.util.Arrays;class Solution {public int maximumElementAfterDecrementingAndRearranging(int[] arr) {Arrays.sort(arr);int required = 1; // 需要构造的下一个数,初始为1(第一个元素必须是1)for (int x : arr) {if (x >= required) {required++; // 可以构造当前required,接下来构造required+1}}return required - 1; // 最大构造到required-1,因为最后一次递增了required}
}

 代码解释

  1. 排序数组:使用Arrays.sort(arr)对数组进行升序排序,以便从小到大处理每个元素。
  2. 初始化变量required表示当前需要构造的下一个数,初始为 1,因为数组的第一个元素必须是 1。
  3. 遍历数组:对于每个元素x,如果x大于等于当前需要构造的数required,则说明可以使用该元素来构造required,并将required加 1,尝试构造下一个更大的数(required + 1)。
  4. 返回结果:最终required - 1即为能够构造的最大数,因为每次成功构造一个数后required会递增,最后一次递增后required比最大数大 1。

这种方法通过贪心策略,每次尽可能构造更大的数,确保了构造的序列是连续递增的,从而最大化了数组中的最大值。时间复杂度主要由排序决定,为 O (n log n),空间复杂度为 O (1)(不考虑排序的栈空间)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/905368.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/905368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python(1) 做一个随机数的游戏

有关变量的&#xff0c;其实就是 可以直接打印对应变量。 并且最后倒数第二行就是可以让两个数进行交换。 Py快捷键“ALTP 就是显示上一句的代码。 —————————————————————————————— 字符串 用 双引号或者单引号 。 然后 保证成双出现即可 要是…

【认知思维】验证性偏差:认知陷阱的识别与克服

什么是验证性偏差 验证性偏差&#xff08;Confirmation Bias&#xff09;是人类认知中最普遍、最根深蒂固的心理现象之一&#xff0c;指的是人们倾向于寻找、解释、偏爱和回忆那些能够确认自己已有信念或假设的信息&#xff0c;同时忽视或贬低与之相矛盾的证据。这种认知偏差影…

Wpf学习片段

IRegionManager 和IContainerExtension IRegionManager 是 Prism 框架中用于管理 UI 区域&#xff08;Regions&#xff09;的核心接口&#xff0c;它实现了模块化应用中视图&#xff08;Views&#xff09;的动态加载、导航和生命周期管理。 IContainerExtension 是依赖注入&…

消息~组件(群聊类型)ConcurrentHashMap发送

为什么选择ConcurrentHashMap&#xff1f; 在开发聊天应用时&#xff0c;我们需要存储和管理大量的聊天消息数据&#xff0c;这些数据会被多个线程频繁访问和修改。比如&#xff0c;当多个用户同时发送消息时&#xff0c;服务端需要同时处理这些消息的存储和查询。如果用普通的…

Stapi知识框架

一、Stapi 基础认知 1. 框架定位 自动化API开发框架&#xff1a;专注于快速生成RESTful API 约定优于配置&#xff1a;通过标准化约定减少样板代码 企业级应用支持&#xff1a;适合构建中大型API服务 代码生成导向&#xff1a;显著提升开发效率 2. 核心特性 自动CRUD端点…

基于深度学习的水果识别系统设计

一、选择YOLOv5s模型 YOLOv5&#xff1a;YOLOv5 是一个轻量级的目标检测模型&#xff0c;它在 YOLOv4 的基础上进行了进一步优化&#xff0c;使其在保持较高检测精度的同时&#xff0c;具有更快的推理速度。YOLOv5 的网络结构更加灵活&#xff0c;可以根据不同的需求选择不同大…

Spring Security与SaToken的对比

Spring Security与SaToken的详细对照与优缺点分析 1. 核心功能与设计理念 对比维度Spring SecuritySaToken核心定位企业级安全框架&#xff0c;深度集成Spring生态&#xff0c;提供全面的安全解决方案&#xff08;认证、授权、攻击防护等&#xff09;轻量级权限认证框架&#…

【docker】--镜像管理

文章目录 拉取镜像启动镜像为容器连接容器法一法二 保存镜像加载镜像镜像打标签移除镜像 拉取镜像 docker pull mysql:8.0.42启动镜像为容器 docker run -dp 8080:8080 --name container_mysql8.0.42 -e MYSQL_ROOT_PASSWORD123123123 mysql:8.0.42 连接容器 法一 docker e…

力扣HOT100之二叉树:543. 二叉树的直径

这道题本来想到可以用递归做&#xff0c;但是还是没想明白&#xff0c;最后还是去看灵神题解了&#xff0c;感觉这道题最大的收获就是巩固了我对lambda表达式的掌握。 按照灵神的思路&#xff0c;直径可以理解为从一个叶子出发向上&#xff0c;在某个节点处拐弯&#xff0c;然后…

web 自动化之 yaml 数据/日志/截图

文章目录 一、yaml 数据获取二、日志获取三、截图 一、yaml 数据获取 需要安装 PyYAML 库 import yaml import os from TestPOM.common import dir_config as Dirdef read_yaml(key,file_name"test_datas.yaml"):file_path os.path.join(Dir.testcases_dir, file_…

rtty操作记录说明

rtty操作记录说明 前言 整理资料发现了几年前做的操作记录&#xff0c;分享出来&#xff0c;希望对大家有用。 rtty-master&#xff1a;rtty客户端程序&#xff0c;其中buffer\log\ssl为源码的子目录&#xff0c;从git上下载https://github.com/zhaojh329&#xff0c; rtty…

mybatis中${}和#{}的区别

先测试&#xff0c;再说结论 userService.selectStudentByClssIds(10000, "wzh or 11");List<StudentEntity> selectStudentByClssIds(Param("stuId") int stuId, Param("field") String field);<select id"selectStudentByClssI…

【运维】MacOS蓝牙故障排查与修复指南

在日常使用macOS系统过程中&#xff0c;蓝牙连接问题时有发生。无论是无法连接设备、连接不稳定还是蓝牙功能完全失效&#xff0c;这些问题都会严重影响我们的工作效率。本文将分享一些实用的排查方法和修复技巧&#xff0c;帮助你解决macOS系统上的蓝牙故障。 问题症状 常见…

数据结构(一) 绪论

一. 时间复杂度: (1)定义: 时间复杂度是衡量算法执行时间随输入规模(通常用n表示)增长的变化趋势的指标,时间复杂度用O符号表示 用于描述算法在最坏情况下或平均情况下的时间需求 时间复杂度关注的是操作次数的增长率&#xff0c;而非具体执行时间 常见的时间复杂度由小到大依次…

网络协议与系统架构分析实战:工具与方法全解

网络协议与系统架构分析实战&#xff1a;工具与方法全解 在互联网系统的开发、运维与安全分析中&#xff0c;协议解析与抓包分析是不可或缺的核心技能。本文将系统梳理主流协议解析工具、协议自动识别方案&#xff0c;并结合实际抓包案例&#xff0c;讲解如何还原和推测底层系…

发那科机器人4(编程实例)

发那科机器人4(编程实例) 一、编程实例1、直线运动实例2、圆弧运动实例3、曲线运动实例4、物料搬运实例5、异步输送带检测一、编程实例 1、直线运动实例 本节内容:直线运动实例 本次实例,采用的是基础模块,以基础模块当中的四边形为例,演示一下机器人的直线运动。 编程…

agent初识

AI Agent 时代已来&#xff1a;不止于聊天的智能体&#xff0c;将如何重塑我们的世界&#xff1f; AI Agent 时代已来&#xff1a;不止于聊天的智能体&#xff0c;将如何重塑我们的世界&#xff1f; 你是否曾惊叹于 ChatGPT 的对答如流&#xff1f;或者 Midjourney 的妙笔生花…

.Net HttpClient 使用Json数据

HttpClient 使用Json数据 现代Web项目中&#xff0c;Json是最常用的数据格式。不论是前后端的交互中&#xff0c;还是纯前端项目中&#xff0c;都是如此。因此&#xff0c;.Net HttpClient 能不能更加方便、快捷的处理Json格式数据&#xff0c;也就至关重要了&#xff01; 文末…

UDP--DDR--SFP,FPGA实现之指令监测模块实现

指令监测模块实现介绍 如下图所示&#xff0c;为指令监测模块的运行框图 将指令设置为8bytes数据&#xff0c;故需要一个64位寄存器进行缓存&#xff0c;在进行数据缓存时&#xff0c;数据不可以输出至下一级模块&#xff0c;故对数据和有效指示信号也应该进行相应延迟&#…

JavaScript双问号操作符(??)详解,解决使用 || 时因类型转换带来的问题

目录 JavaScript双问号操作符&#xff08;??&#xff09;详解&#xff0c;解决使用||时因类型转换带来的问题 一、双问号操作符??的基础用法 1、传统方式的痛点 2、双问号操作符??的精确判断 3、双问号操作符??与逻辑或操作符||的对比 二、复杂场景下的空值处理 …