LeetCode: 2779. 数组的最大美丽值

题目

给你一个下标从 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 <= 105
0 <= nums[i], k <= 105

思路

首先我自己先试一试暴力解决,

  • 法一(会超时):求每一个元素的最大值和最小值后放入动态数组里面并且记录所有元素的最大值和最小值,从最小值循环(用i)到最大值看i是不是在每一个数组的范围,是就加1,记录最大可以在范围里面的个数
  • 方法二:排序 + 滑动窗口:先对数组 nums进行排序,数组中的最大美丽值对应的相等元素为z,z的取值范围是[z-k,z+k],所以题目等价于找到最大最小值之差小于等于 2k 的最长连续子数组,某连续子数组的右端点为 i,左端点为 j,依次枚举右端点 i,使题目满足nums[i]-nums[j]<=2k,不断地右移左端点 j,同理,这样就可以求出最大美丽值

代码

方法一

class Solution {
public:
    int maximumBeauty(vector<int>& nums, int k) {
        vector<vector<int>> a(nums.size(), vector<int>(2));
        int min = INT_MAX;
        int max = INT_MIN;
        for(int i = 0;i < nums.size();i++){
            a[i][0] = nums[i]-k;
            if(a[i][0] < min) min = a[i][0];
            a[i][1] = nums[i]+k;
            if(a[i][1] > max) max = a[i][1];
        }
        int res = 0;
        for(int i = min;i <= max;i++){
            int num = 0;
            for(int j = 0;j < nums.size();j++){
                if(i>=a[j][0]&&i<=a[j][1]) num++;
            }
            if(num > res) res = num;
        }
        return res;
    }
};

方法二:排序 + 滑动窗口

class Solution {
public:
    int maximumBeauty(vector<int>& nums, int k) {
        int res = 0, n = nums.size();
        sort(nums.begin(), nums.end());
        for (int i = 0, j = 0; i < n; i++) {
            while (nums[i] - 2 * k > nums[j]) {
                j++;
            }
            res = max(res, i - j + 1);
        }
        return res;
    }
};

总结

  • 学习了排序 + 滑动窗口的方法解决最大美好度问题,使用了贪心算法

相关推荐

  1. LeetCode: 2779. 美丽

    2024-06-15 13:28:03       8 阅读
  2. 差分,LeetCode 2779. 美丽

    2024-06-15 13:28:03       10 阅读
  3. LeetCode-410.分割

    2024-06-15 13:28:03       35 阅读
  4. leetcode 1749.任意子绝对值

    2024-06-15 13:28:03       9 阅读
  5. LeetCode 0410.分割:二分

    2024-06-15 13:28:03       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-15 13:28:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-15 13:28:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-15 13:28:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-15 13:28:03       18 阅读

热门阅读

  1. QT_day1

    QT_day1

    2024-06-15 13:28:03      9 阅读
  2. wsl子系统ubuntu20.04 设置docker服务开机自启动

    2024-06-15 13:28:03       11 阅读
  3. Wake Lock API:保持设备唤醒的利器

    2024-06-15 13:28:03       9 阅读
  4. 电商项目-day03

    2024-06-15 13:28:03       6 阅读
  5. 国内高校ACM ICPC的主要成绩

    2024-06-15 13:28:03       5 阅读
  6. 大数据集群各种报错及解决方案

    2024-06-15 13:28:03       6 阅读
  7. [whl]树莓派armv7l文件onnx的whl所有下载地址汇总

    2024-06-15 13:28:03       7 阅读
  8. 前端面经总结、学习【2023秋招】

    2024-06-15 13:28:03       9 阅读
  9. Vue实现excel导出,不请求后端

    2024-06-15 13:28:03       6 阅读
  10. YoloV8改进策略:卷积篇|Kan行天下之FastKANConv

    2024-06-15 13:28:03       12 阅读