[LeetCode] 3397. Maximum Number of Distinct Elements After Operations

news/2025/10/19 8:09:49/文章来源:https://www.cnblogs.com/cnoodle/p/19150406

You are given an integer array nums and an integer k.

You are allowed to perform the following operation on each element of the array at most once:

Add an integer in the range [-k, k] to the element.
Return the maximum possible number of distinct elements in nums after performing the operations.

Example 1:
Input: nums = [1,2,2,3,3,4], k = 2
Output: 6

Explanation:
nums changes to [-1, 0, 1, 2, 3, 4] after performing operations on the first four elements.

Example 2:
Input: nums = [4,4,4,4], k = 1
Output: 3

Explanation:
By adding -1 to nums[0] and 1 to nums[1], nums changes to [3, 5, 4, 4].

Constraints:
1 <= nums.length <= 105
1 <= nums[i] <= 109
0 <= k <= 109

执行操作后不同元素的最大数量。

给你一个整数数组 nums 和一个整数 k。

你可以对数组中的每个元素 最多 执行 一次 以下操作:

将一个在范围 [-k, k] 内的整数加到该元素上。
返回执行这些操作后,nums 中可能拥有的不同元素的 最大 数量。

思路

思路是贪心。题目给的是一个 nums 数组和一个整数 k。首先这道题必须要排序,或者需要有一个类似 treemap 的数据结构使得最后的结果有序,否则是不太好判断某个数字是否存在的。这里我选择排序。

对 input 数组排序过后,我们从第一个数字开始判断。这里的思路是需要让每个数字尽量小,这样才能留出更多余地给后面的数字让他们尽量不重复。对于第一个数字 nums[0],我们可以把它变成 nums[0] - k,这样是最小的。然后我们记录下当前的 pre = nums[0] - k。为什么变量叫 pre 呢?因为我们需要记录前一个数字的值,方便和后面的数字比较。那么对于下一个数字 nums[1],他需要满足

  • 介于 [nums[1] - k, nums[1] + k] 之间
  • 大于 pre
  • 所以其实是介于 [max(pre + 1, nums[1] - k), nums[1] + k] 之间

如果数字满足这个区间,则说明找到了一个新的不同数字,我们就把 pre 更新为 max(pre + 1, nums[1] - k),并且结果 count++。如果不满足这个区间,则说明无法找到一个新的不同数字,我们就跳过这个数字,继续下一个数字的判断。

复杂度

时间O(nlogn),排序的时间复杂度
空间O(1)

代码

Java实现

class Solution {public int maxDistinctElements(int[] nums, int k) {Arrays.sort(nums);int count = 0;int pre = Integer.MIN_VALUE;for (int num : nums) {int left = num - k;int right = num + k;int cur = Math.max(pre + 1, left);if (cur <= right) {count++;pre = cur;}}return count;}
}

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

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

相关文章

Metasploit Framework 6.4.95 (macOS, Linux, Windows) - 开源渗透测试框架

Metasploit Framework 6.4.95 (macOS, Linux, Windows) - 开源渗透测试框架Metasploit Framework 6.4.95 (macOS, Linux, Windows) - 开源渗透测试框架 Rapid7 Penetration testing, updated Oct 18, 2025 请访问原文链…

Cisco IOS XRv 9000 Router IOS XR Release 7.11.2 MD - 思科 IOS XR 网络操作系统

Cisco IOS XRv 9000 Router IOS XR Release 7.11.2 MD - 思科 IOS XR 网络操作系统Cisco IOS XRv 9000 Router IOS XR Release 7.11.2 MD Cisco IOS XRv 9000 路由器 | 思科 IOS XR 网络操作系统 请访问原文链接:http…

设备端语音处理技术解析

本文详细介绍了设备端语音处理的技术架构,包括自动语音识别模型压缩、量化感知训练、稀疏化方法、分支编码器网络设计,以及硬件软件协同优化方案,实现低延迟和低带宽的语音交互体验。设备端语音处理技术解析 创新训…

毕设项目基于SpringBoot的河南非遗助推平台\251004(白嫖源码+演示录像)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、资料可视化、文案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

语音技术跨学科研究新趋势

本文探讨了语音技术领域的跨学科融合趋势,包括语音合成与识别模型的循环训练、语言理解改善语音韵律,以及BERT等语言模型在语音系统中的应用,展现了不同技术领域间的协同效应。Interspeech 2022:跨学科研究的增长 …

中国晶圆厂排行榜:谁是下一个台积电

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087半导体是一场长跑——资金、设备、工艺、人才缺一不可。今天我们把…

一首很棒的歌

《冷冷的夏》演唱:王芷蕾作词:姚谦作曲:Bobby Doll 想着他 想他那夜说的话木棉花 怎能灿烂一季夏怪只怪那时不明白话中话 木棉花落尽我才发现我好傻我真的好傻 我好傻 我好傻 迷惑的心四处张望不见炽热的胸膛多情的…

机器学习优化云虚拟机部署技术解析

本文介绍了一种基于决策树机器学习模型的虚拟机部署算法FirePlace,通过历史数据训练模型,在测试中比传统算法提升10%性能,有效解决云环境中虚拟机资源分配和负载均衡问题。使用机器学习优化云环境中的虚拟机部署 在…

251019

251019苹果真是便宜又好吃,但就是觉得没有那些又贵又难吃的水果高贵

每日反思(2025_10_18)

今天刷了几道关于链表的力扣的题

tryhackme-预安全-网络基础知识-什么是网络-04

tryhackme-Pre Security-Pre Security-Network Fundamentals-What is Networking? 房间地址:https://tryhackme.com/room/whatisnetworking 这是网络安全入门的基础模块的计算机科学基础知识:Careers in Cyber(网络…

C++ std::function简单笔记

std::function简单笔记基本形式 #include <iostream> #include <functional>/** * 1. C++11新增的类型别名声明方式 */using pFunc1 = void(); //普通函数 using pFunc2 = void(int, int); //带参…

【C++】基于asio的异步https server

//跨平台异步http server #define _WIN32_WINNT 0x0A00 #include <iostream> #include <vector> #include <string> #include <ctime> //std::tm,std::strftime #include <chrono> #inc…

tryhackme-预安全-网络安全简介-网络职业-03

tryhackme-Pre Security-Introduction to Cyber Security-Careers in Cyber 房间地址:https://tryhackme.com/room/careersincyber 这是网络安全入门的基础模块的计算机科学基础知识:Careers in Cyber(网络职业),…

tryhackme-预安全-网络安全简介-防御性安全简介-02

tryhackme-Pre Security-Introduction to Cyber Security-Defensive Security Intro 房间地址:https://tryhackme.com/room/defensivesecurityintro 这是网络安全入门的基础模块的计算机科学基础知识:Defensive Secu…

明天发点东西

就这样,没了。

Luogu P14254 分割(divide) 题解 [ 蓝 ] [ 分类讨论 ] [ 组合计数 ]

Think twice, code once.分割 Think twice, code once. 首先观察合法划分的性质:树的深度集合是一段连续的区间,即 \([dep_{root}, dep_\max]\)。 因为 \(S_1\) 的根节点深度最小(\(\min L \ge L_{S_1}\)),而区间…

嵌入式第六周作业任务二--PWM呼吸灯

1.编写所需头文件2.定义LED的引脚3.定义呼吸灯参数 分别定义呼吸灯的PWM周期,呼吸步进值以及呼吸更新间隔(ms)。4.定义全局变量 分别定义TIM3 PWM占空比,TIM4 PWM占空比(从中间开始,与TIM3错开),TIM3方向(1增加…

2022 ICPC Shenyang

2022 ICPC Shenyang C 区间越大越好、答案区间的左右端点一定可以是已有的数,然后就可以 n 方做了 E 不太懂啊,虽然过了 i64 pw2[N * N + 5];std::vector<int> adj[N + 5]; int d[N + 5], back[N + 5]; // bac…