当前位置: 首页 > news >正文

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

一、题目描述

二、解题思路

整体思路

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

具体思路

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

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

       // 初始化第一个窗口

        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);

我们需要重写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;

三、代码实现

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;}
};

http://www.dtcms.com/a/570204.html

相关文章:

  • MAC-SQL:SQL-Llama 的具体训练流程
  • 国内python 做的网站网站建设教程照片
  • 家用电脑和宽带做网站做网站需要多长时间才能做好
  • 配置git/创建第一个智能相册保存快照
  • 网站建设与维护本科教材写文的免费软件
  • 网站开发需要多少行代码兰州吸引用户的网站设计
  • C# XML文件的读写V2.0
  • 怎么做可以把网站图片保存下来天猫网站左侧导航用js怎么做
  • 台州网站建设哪家公司好成品源码灬1688高清完整版
  • 东莞网站建设广东网站建设模版
  • 郑州做网站好网站建设 全网推广
  • asp.net网站开发 vs2017网站目录在哪
  • 接口自动化测试框架搭建详解
  • 成都网站建设爱特通dw软件下载
  • 台州椒江网站建设公司软件开发外包费用评估
  • springboot配置项目的url
  • 智慧车辆视频分析技术
  • 自己制作上传图片的网站怎么做网页设计教程博主
  • 错题笔记总结:PCI与PCIe:并行与串行
  • 做内部网站费用广东建的电商网站叫啥
  • 云南省城乡住房与建设厅网站物业公司网站模板
  • 深圳在建高铁站wordpress 漏洞
  • 学做网站的步骤ps如何做网站专题
  • 怎么看网站是什么语言做的后台阿里云做网站麻烦吗
  • 网站开发 前端vue 后端c网站开发的公司名称
  • PCB画板:电阻、电容、电感、二极管、三极管、mos管
  • 单网页网站如何做医疗网站的运营
  • 外贸有哪些网站合肥网站搭建工作室
  • 力扣3318——计算子数组的 x-sum I(偷懒版)
  • 新手学做网站代码教育类网站建设