数组的最大美丽值

2779. 数组的最大美丽值 - 力扣(LeetCode)

Solution

这题有两种做法,一个是定长的滑动窗口一个是变长的滑动窗口。

首先看我自己的想法,受740. 删除并获得点数 - 力扣(LeetCode) 的启发,这题可以映射到值域,然后求窗口大小为2*k+1的最大窗口累加和。

这种做法的时间复杂度是O(n),但是空间复杂度较高,取决于数组的最大值。

cpp 复制代码
int maximumBeauty(vector<int>& nums, int k) {
        int n = nums.size();
        int maxNum = ranges::max(nums);
        vector<int> value_count(maxNum + 1, 0);
        long long sumNum = 0;
        for (int i = 0; i < n; ++i) {
            value_count[nums[i]]++;
            sumNum += nums[i];
        }
        int len = 2 * k + 1, window_count = 0, ans = 0;
        if (len >= maxNum)
            return n;
        for (int r = 0; r <= maxNum; ++r) {
            window_count += value_count[r];
            int l = r - len + 1;
            if (l >= 0) {
                ans = max(ans, window_count);
            }
            if (l >= 0) {
                window_count -= value_count[l];
            }
        }
        return ans;
    }

第二种做法也是比较有启发价值的,由于要求的是子序列的长度,跟数组的顺序无关,所以可以对数组进行排序,排完序之后就很直观清晰了,求一个区间,这个区间满足最大值和最小值之差小于等于2*k,求这个区间的最大长度,也是很典型的变长滑动窗口问题。

3634. 使数组平衡的最少移除数目 - 力扣(LeetCode)很相似,都是排序之后的变长滑动窗口。

cpp 复制代码
int maximumBeauty(vector<int>& nums, int k) {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        int l = 0, ans = 0;
        for (int r = 0; r < n; ++r) {
            while (nums[r] - nums[l] > 2 * k) {
                l++;
            }
            ans = max(ans, r - l + 1);
        }
        return ans;
    }
相关推荐
京东零售技术16 小时前
扛起技术大梁的零售校招生们 | 1024技术人特别篇
算法
爱coding的橙子17 小时前
每日算法刷题Day78:10.23:leetcode 一般树7道题,用时1h30min
算法·leetcode·深度优先
Swift社区17 小时前
LeetCode 403 - 青蛙过河
算法·leetcode·职场和发展
地平线开发者17 小时前
三种 Badcase 精度验证方案详解与 hbm_infer 部署实录
算法·自动驾驶
papership17 小时前
【入门级-算法-5、数值处理算法:高精度的减法】
算法·1024程序员节
lingran__17 小时前
算法沉淀第十天(牛客2025秋季算法编程训练联赛2-基础组 和 奇怪的电梯)
c++·算法
DuHz17 小时前
基于MIMO FMCW雷达的二维角度分析多径抑制技术——论文阅读
论文阅读·物联网·算法·信息与通信·毫米波雷达
一二学长18 小时前
快速排序(JAVA详细讲解快速排序的四种方式)
数据结构
Dragon_D.18 小时前
排序算法大全——插入排序
算法·排序算法·c·学习方法
大数据张老师18 小时前
数据结构——红黑树
数据结构·算法·红黑树