数组的最大美丽值

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;
    }
相关推荐
dazzle42 分钟前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵44 分钟前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
张张努力变强1 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发1 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
wWYy.1 小时前
数组快排 链表归并
数据结构·链表
张登杰踩1 小时前
MCR ALS 多元曲线分辨算法详解
算法
YuTaoShao1 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
波波0071 小时前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
风暴之零2 小时前
变点检测算法PELT
算法
深鱼~2 小时前
视觉算法性能翻倍:ops-cv经典算子的昇腾适配指南
算法·cann