leetcode 3318 计算子数组的x-sum I

一、题目描述

二、解题思路

整体思路

由于本题涉及到的是子数组 问题,所以可以采用滑动窗口+哈希表+排序来解决这个问题。维护长度为k的窗口,根据题意来计算x-sum;

具体思路

(1)首先,进行变量的声明,ret用于承接最后的返回值,hash表用于统计当前窗口内数字出现的频次;

(2)初始化第一个窗口,填写哈希表,处理第一个窗口。由于哈希表不能直接排序,所以我们需要将哈希表中的pair键值对加入到数组com中,根据题意进行排序选择,代码如下:

// 初始化第一个窗口

for(int i = 0; i < k; i++) {

hashnums\[i]++;

}

// 处理第一个窗口

vector<pair<int,int>> consequence;

for(auto& p : hash) {

consequence.push_back(p);

}

sort(consequence.begin(), consequence.end(), compare);

long long current = 0;

int limit = min(x, (int)consequence.size());

for(int i = 0; i < limit; i++) {

current += (long long)consequencei.first * consequencei.second;

}

ret.push_back(current);

我们需要重写sort函数的比较器,即compare:

//重写sort比较器

static bool compare(const pair<int,int>& a, const pair<int,int>& b){

if(a.second == b.second) return a.first > b.first;

return a.second > b.second;

}

(3)利用滑动窗口来处理后面的子数组,循环中按照"进哈希表------哈希表转化成数组------排序选择------更新current------更新ret"的顺序进行处理,直到right==n;

(4)最后,返回填完的ret数组,即为所求的x-sumI;

三、代码实现

cpp 复制代码
class Solution {
public:
    //重写sort比较器
    static bool compare(const pair<int,int>& a, const pair<int,int>& b){
        if(a.second == b.second) return a.first > b.first;
        return a.second > b.second;
    }
    
    vector<int> findXSum(vector<int>& nums, int k, int x) {
        int n = nums.size();
        vector<int> ret;
        unordered_map<int, int> hash;
        
        // 初始化第一个窗口
        for(int i = 0; i < k; i++) {
            hash[nums[i]]++;
        }
        
        // 处理第一个窗口
        vector<pair<int,int>> consequence;
        for(auto& p : hash) {
            consequence.push_back(p);
        }
        sort(consequence.begin(), consequence.end(), compare);
        
        long long current = 0;
        int limit = min(x, (int)consequence.size());
        for(int i = 0; i < limit; i++) {
            current += (long long)consequence[i].first * consequence[i].second;
        }
        ret.push_back(current);
        
        // 滑动窗口
        for(int right = k; right < n; right++) {
            int left = right - k;
            
            // 更新哈希表
            hash[nums[left]]--;
            if(hash[nums[left]] == 0) {
                hash.erase(nums[left]);
            }
            hash[nums[right]]++;
            
            // 重建数组并排序
            consequence.clear();
            for(auto& p : hash) {
                consequence.push_back(p);
            }
            sort(consequence.begin(), consequence.end(), compare);
            
            // 计算和
            current = 0;
            limit = min(x, (int)consequence.size());
            for(int i = 0; i < limit; i++) {
                current += (long long)consequence[i].first * consequence[i].second;
            }
            ret.push_back(current);
        }
        
        return ret;
    }
};
相关推荐
shehuiyuelaiyuehao6 小时前
算法31,前缀和,可被k整除的子数组
数据结构·python·算法
测试19986 小时前
如何用appium搭建Android自动化测试框架?
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
203号居民7 小时前
LeetCode hot 100 — 141. 环形链表2
算法·leetcode·链表
玖玥拾8 小时前
LeetCode 202 快乐数
算法·leetcode
LuminousCPP8 小时前
数据结构-二叉树(六):BFS层序遍历与完全二叉树判断|复用链式队列 + (N_0=N_2+1) 性质证明
c语言·数据结构·笔记·算法·二叉树·宽度优先
ZhouDevin9 小时前
算法论文/数据集3——CLD(TMLR2025)压缩训练集,仅保留对验证集有益的样本
人工智能·深度学习·算法·计算机视觉
码匠许师傅9 小时前
【设计模式精讲】14.外观模式(Facade)
c++·设计模式·uml·外观模式
Tim_109 小时前
【LeetCode】29、两数相除
算法·leetcode·职场和发展
船厂电气自动化ai大模型10 小时前
AI大模型与数学/第63课:矩阵定义、矩阵加法、标量乘法(逐级精讲)
数据结构·人工智能·深度学习·线性代数·算法
余额瞒着我当琳10 小时前
算法修炼 chapter 2 双指针进阶、盛最多水的容器、有效三角形的个数、两数之和、三数之和、四数之和
算法