数组的最大美丽值

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;
    }
相关推荐
毕竟是shy哥2 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲2 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
晊晌_h4 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦4 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考4 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客5 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
小白羊丨8 小时前
如何诊断 Prompt 模板导致的效果下降?
人工智能·算法·prompt
OPEN-F9 小时前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法
lisin-lee-cooper10 小时前
【leetcode658】有序数组找出k个最接近x的数
java·数据结构·算法
sunburn-10 小时前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法