数组的最大美丽值

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;
    }
相关推荐
熊猫钓鱼>_>22 分钟前
面试出现 606 次的第 K 大,被拆成三个问题问
算法·面试·职场和发展·校招·面经·oj·ai生成
xuxigifxfh38 分钟前
牛客:BISHI2 【模板】栈的操作
java·开发语言·windows·算法
aqiu1111111 小时前
【C++算法打怪专栏】LeetCode 402. 移掉 K 位数字(单调栈 + 贪心)
c++·算法·leetcode
糖果豆豆1 小时前
对象是字段,还是关系?集合论和范畴论吵了三十年,答案是两个都对
算法·架构
第六种自由2 小时前
[路飞]_Leetcode 22. 括号生成
javascript·算法·leetcode
isyoungboy2 小时前
事件驱动状态机与循环扫描状态机:两种计算模型的比较研究
算法·状态机
行者全栈架构师2 小时前
【鸿蒙心迹】从手机到平板、折叠屏——多端适配自查清单与踩坑实录(HarmonyOS 7.x)
前端·算法·架构
longlongzihan2 小时前
LeetCode 24.两两交换链表中的节点:虚拟头结点与指针
算法·leetcode·链表
residual_fan2 小时前
基于控制感知域对抗网络的变工况故障诊断:从控制系统与运行状态协同的角度建立模型
人工智能·算法·数据挖掘·数据分析
心仪久了会沦陷2 小时前
C语言数据结构入门——队列补充:循环队列的数组实现
c语言·开发语言·数据结构·笔记