数组的最大美丽值

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;
    }
相关推荐
仰泳的熊猫1 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
无极低码5 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发5 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
罗超驿5 小时前
独立实现双向链表_LinkedList
java·数据结构·链表·linkedlist
superior tigre6 小时前
22 括号生成
算法·深度优先
努力也学不会java7 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎7 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan7 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
智者知已应修善业8 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机