【LeetCode:2779】数组的最大美丽值(Java)

题目链接

题目描述

给你一个下标从 0 开始的整数数组 nums 和一个 非负 整数 k 。

在一步操作中,你可以执行下述指令:

在范围 [0, nums.length - 1] 中选择一个 此前没有选过 的下标 i 。

将 nums[i] 替换为范围 [nums[i] - k, nums[i] + k] 内的任一整数。

数组的 美丽值 定义为数组中由相等元素组成的最长子序列的长度。

对数组 nums 执行上述操作任意次后,返回数组可能取得的 最大 美丽值。

注意:你 只 能对每个下标执行 一次 此操作。

数组的 子序列 定义是:经由原数组删除一些元素(也可能不删除)得到的一个新数组,且在此过程中剩余元素的顺序不发生改变。

示例 1:

输入:nums = [4,6,1,2], k = 2

输出:3

解释:在这个示例中,我们执行下述操作:

  • 选择下标 1 ,将其替换为 4(从范围 [4,8] 中选出),此时 nums = [4,4,1,2] 。
  • 选择下标 3 ,将其替换为 4(从范围 [0,4] 中选出),此时 nums = [4,4,1,4] 。
    执行上述操作后,数组的美丽值是 3(子序列由下标 0 、1 、3 对应的元素组成)。
    可以证明 3 是我们可以得到的由相等元素组成的最长子序列长度。
    示例 2:

输入:nums = [1,1,1,1], k = 10

输出:4

解释:在这个示例中,我们无需执行任何操作。

数组 nums 的美丽值是 4(整个数组)。

提示:

1 <= nums.length <= 10^5^

0 <= nums[i], k <= 10^5^

求解思路

  • 排序 + 滑动窗口:已知序列的顺序对最后的结果并无影响,因此我们可以对数组进行排序。假设最后的美丽值为 x x x,那么经过操作可以变为 x x x 的数值范围为 [ x − k , x + k ] [x-k,x+k] [x−k,x+k]。因此对于排序后的数组,我们只需要找出最大值和最小值差为 2 k 2k 2k 的最长连续子序列即可。
  • 令滑动窗口的右边界为 i i i,左边界为 j j j。从 0 0 0 开始依次枚举直到找到最大值即可。

实现代码

java 复制代码
class Solution {
    public int maximumBeauty(int[] nums, int k) {
        int ans = 0;
        Arrays.sort(nums);
        for (int i = 0, j = 0; i < nums.length; i ++) {
            while (nums[i] - nums[j] > 2 * k) {
                ++ j;
            }
            ans = Math.max(ans, i - j + 1);
        }
        return ans;
    }
}
相关推荐
羚通科技6 分钟前
视频监控管理平台LntonAIServer视频智能分析抖动检测算法应用场景
大数据·人工智能·算法·音视频
搁浅小泽12 分钟前
数据结构绪论
数据结构·算法
摆烂小白敲代码25 分钟前
大一新生以此篇开启你的算法之路
c语言·数据结构·c++·人工智能·经验分享·算法
y_dd27 分钟前
【mechine learning-六-supervise learning之线性回归模型】
算法·回归·线性回归
爱吃芝麻汤圆28 分钟前
349. 两个数组的交集-LeetCode(C++)
c++·leetcode
一粟10228 分钟前
Spring Boot:现代化Java应用开发的艺术
java·spring boot·后端
码农小伙28 分钟前
Spring-bean的生命周期-尾篇
java·后端·spring
sanzk33 分钟前
sql格式化工具
java·数据库·sql
IT研究室33 分钟前
计算机毕业设计选题推荐-校园车辆管理系统-Java/Python项目实战(亮点:数据可视化分析、账号锁定)
java·spring boot·python·django·毕业设计·源码·课程设计
Marchwho40 分钟前
面试—MySQL
java·数据库·mysql