leetCode周赛-328

news2024/12/27 3:46:55

相关题解

  • 题目一:6291. 数组元素和与数字和的绝对差
  • 题目二:6292. 子矩阵元素加 1
  • 题目三:6293. 统计好子数组的数目
  • 题目四:2538. 最大价值和与最小价值和的差值

题目一:6291. 数组元素和与数字和的绝对差

题目链接:
https://leetcode.cn/problems/difference-between-element-sum-and-digit-sum-of-an-array/
解题分析:
很简单的签到题啦,快速过
AC代码:

class Solution {
public:
    int solve(int num)
    {
        int sum=0;
        while(num)
        {
            sum+=num%10;
            num/=10;
        }
        return sum;
    }
    int differenceOfSum(vector<int>& nums) {
        int len=nums.size();
        int sum1=0,sum2=0;
        for(int i=0;i<len;i++)
        {
            sum1+=nums[i];
            sum2+=solve(nums[i]);
        }
        return abs(sum1-sum2);
    }
};

题目二:6292. 子矩阵元素加 1

题目链接:
https://leetcode.cn/problems/increment-submatrices-by-one/
解题分析:
二维差分,忘记了模板,比赛的时候现推,推了老半天,最好是能够直接记住
具体二维差分讲解间博客:https://blog.csdn.net/weixin_45629285/article/details/111146240
注意两个重要点:

  1. s[i][j]是以(i,j)为下标的左上角矩阵所有元素的和,也就是左上角为(0,0),右下角为(i,j)的矩阵
  2. a[i][j]加一,会使得以(i,j)为下标位置的右下角的矩阵所有的s都加一,也就是求和时包含a[i][j]这个元素的所有s加一,而不是二维数组遍历时经过a的那些位置的s加一,图中只有粉色位置的s值会加一,蓝色的不会
    在这里插入图片描述
  3. 推二维差分的时候多多借鉴一维差分的思路,类比着推,一般a和s从下标1开始赋值比较好算
  4. vector数组在没有分配空间或者没有push_back值的时候不能使用下标进行访问和赋值,要么就用push_back来添加元素,要么就先resize,再用下标访问或赋值
    AC代码:
class Solution {
public:
    vector<vector<int>> rangeAddQueries(int n, vector<vector<int>>& queries) {
        int a[n+1][n+1];
        memset(a,0,sizeof(a));
        int len=queries.size();
        //cout<<queries[0][3]<<endl;
        for(int i=0;i<len;i++)
        {
            int x1=queries[i][0],y1=queries[i][1],x2=queries[i][2],y2=queries[i][3];
            a[x1][y1]+=1;
            a[x1][y2+1]-=1;
            a[x2+1][y1]-=1;
            a[x2+1][y2+1]+=1;
        }
        vector<vector<int>>s(n+1);
        for (int i = 0; i < s.size(); i++) s[i].resize(n+1);
        vector<vector<int>>ans(n);
       // s[0][0]=a[0][0];
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
               s[i][j]=s[i][j-1]+s[i-1][j]-s[i-1][j-1]+a[i-1][j-1];
               ans[i-1].push_back(s[i][j]);
            }
        }
        return ans;
    }
};

题目三:6293. 统计好子数组的数目

题目链接:
https://leetcode.cn/problems/count-the-number-of-good-subarrays/
解题分析:

  1. 首先看这个数据范围为1e5,要控制在O(nlogn)了,然后就是感觉是双指针就能做,虽然使用双指针要先经过严格的证明,证明当j往右走的时候i只能往右走,也就是二者成单调关系,但是有时候考虑一下模拟走的过程中会不会有什么问题,如果用双指针模拟没什么问题也就可以用了;双指针就是考虑清楚什么时候j往右走什么时候停下来,什么时候i往右走什么时候停下来就行,我个人喜欢每次while循环里只走一步,要么j走,要么i走,要么i和j都走一步,不喜欢在里面再写循环(一直走直到怎么怎么样)
  2. 这个题中,维护一个[i,j]区间,
    当这个区间内的满足条件的对数还不够的时候j就需要不断往前走,直到对数够的时候当前[i,j]区间和剩下j右边的那些位置的数分别可以构成n-j个数组,更新数组个数
    当这个区间内的满足条件的对数足够k个时,就可以让i往前走了,并且i往前走的过程中有左边的数字从区间中被淘汰出去,就需要更新一下区间内的对数
    注意,一个区间中比如3可能出现多次,每两个3之间就能组成一对儿,因此要保存区间内每个数出现的次数,多纳入一个3时对数需要更新区间内3的个数那么多对
    AC代码:
class Solution {
public:
    map<int,int>exit;  //存i,j区间里的数字及其个数 
    long long countGood(vector<int>& a, int k) {
        int n=a.size();
        int i=0,j=-1;
        long long dui=0,sum=0;
        while(j<n)
        {
            if(dui<k)   //对数不够,j往前走
            {
                j++;
                if(exit[a[j]])  //加入的数字在i,j区间里有
                {
                    dui+=exit[a[j]];  //有几个对数就加几 
                } 
                exit[a[j]]++;
            } 
            else   //对数够,i往前走 
            {
                if(dui>=k) sum+=n-j;
                if(exit[a[i]]>=1) 
                {
                    dui-=exit[a[i]]-1;   //i,j区间里还剩有该数字,剩下多少个对数就减少多少
                } 
                exit[a[i]]--;    //区间内个数减一 
                i++; 
            }
        }
        return sum;
    }
};

题目四:2538. 最大价值和与最小价值和的差值

题目链接:
https://leetcode.cn/problems/difference-between-maximum-and-minimum-price-sum/
解题分析:

  1. 解法一:求树的直径,题目翻译过来其实就是找出树中所有的最长路径(树中最远的两个结点),然后求这些路径中权值和最大为多少,也就是求树的直径
    具体的详细解答参考博客:
    https://leetcode.cn/problems/difference-between-maximum-and-minimum-price-sum/solution/by-kpole-ces2/
    求的时候可以用dfs也可以用bfs
    AC代码:
class Solution {
public:
    const static int N=100005;
    int degree[N];
    vector<int>adj[N];   //邻接表 
    //int visited[N];
    long long Max=0,now=0,ans=0;
    int max_e;
    long long ds[N];   //s到每个点的距离
    long long dt[N];   //t到每个点的距离
    
   void dfs(int s,int fa,long long a[],vector<int>& price)
    {
    // 	cout<<now<<endl;
        a[s]=now;
        if(now>Max) 
        {
            Max=now;
            max_e=s;
        }
        for(int i=0;i<adj[s].size();i++)
        {
            if(adj[s][i]==fa)  continue;
            now+=price[adj[s][i]];
            dfs(adj[s][i],s,a,price);
            now-=price[adj[s][i]];
        }
    }
    
    long long maxOutput(int n, vector<vector<int>>& edges, vector<int>& price) {
        
        for(int i=0;i<edges.size();i++)
        {
            degree[edges[i][0]]++;
            degree[edges[i][1]]++; 
            adj[edges[i][0]].push_back(edges[i][1]);
            adj[edges[i][1]].push_back(edges[i][0]);
        }
        dfs(0,-1,ds,price);
        int s=max_e;
        
        now=price[s],Max=0;
        dfs(s,-1,ds,price);
        int t=max_e;
        
        now=price[t],Max=0;
        dfs(t,-1,dt,price);
        
        for(int i=0;i<n;i++)
        {
        //	cout<<ds[i]<<" ";
            ans=max(ans,ds[i]-min(price[s],price[i]));
            ans=max(ans,dt[i]-min(price[t],price[i]));
        }
        return ans;
    }
};
  1. 解法二:DP解法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web Security 之 Insecure deserialization

Insecure deserialization 在本节中&#xff0c;我们将介绍什么是不安全的反序列化&#xff0c;并描述它是如何使网站遭受高危害性攻击的。我们将重点介绍典型的场景&#xff0c;并演示一些 PHP、Ruby 和 Java 反序列化的具体示例。最后也会介绍一些避免不安全的反序列化漏洞的…

14正交向量与子空间

正交向量与子空间 本章研究的重点还是之前提到过的子空间&#xff0c;但是本章我们主要从正交的角度来探讨这些子空间具有的性质&#xff0c;主要内容见下图。 注意&#xff0c;上图指出了我们之前没有关注到的子空间的一些性质&#xff1a;对于一个矩阵&#xff0c;其零空间…

微信推送消息给女友提醒每天天气情况,本文讲解流程,附带代码,可快速上手。

实现的效果图 此模板为自己添加的&#xff0c;各位看客可以自行添加&#xff0c;如何添加接着往下看。备注在数据库自定义设置。如果你非专业人士&#xff0c;可以联系作者给你专属设置。如果需要代为设置跳转到文章结束位置。 完整的代码 代码下载地址 微信公众号设置 申…

《Linux Shell脚本攻略》学习笔记-第八章

8.1 简介 TCP/IP网络的运作过程就是在节点之间传递分组。每一个分组中都包含了目标的IP地址以及处理分组中数据的应用程序端口号。 当节点接收到分组时&#xff0c;它会查看自己是否就是改分组的目的地。如果是&#xff0c;节点会再检查端口号并调用相应的应用程序来处理分组数…

Cookie 会话身份验证是如何工作的?

在 Web 应用程序中&#xff0c;Cookie-Session 是一种标准的身份验证方法。饼干&#xff0c;也被称为“sweet cookies”。类型为“小文本文件”&#xff0c;是指一些网站为了识别用户身份而存储在客户端的数据。Session的主要功能是通过服务器记录用户的状态。 在典型的在线购物…

类与类之间关系的表示方式

1.关联关系 关联关系是对象之间的一种引用关系&#xff0c;用于表示一类对象与另一类对象之间的联系&#xff0c;如老师和学生&#xff0c;师傅和徒弟&#xff0c;丈夫和妻子等。关联关系是类与类之间最常用的一种关系&#xff0c;分为一般关联关系&#xff0c;聚合关系和组合…

郭天祥十天入门单片机学习笔记

电子元件 排阻 有两种&#xff1a; nn1 二极管 几个概念 限流电阻&#xff1a;与二极管串联&#xff0c;防止电流过大烧毁二极管导通压降&#xff1a;二极管亮起的最小电压 贴片式绿色为阴极&#xff0c;插入式短脚为阴极 数码管 共阴极&#xff1a;对应段选信号置1亮…

测试开发 | 这些常用测试平台,你们公司在用的是哪些呢?

测试管理平台是贯穿测试整个生命周期的工具集合&#xff0c;它主要解决的是测试过程中团队协作的问题。在整个测试过程中&#xff0c;需要对测试用例、Bug、代码、持续集成等等进行管理。下面分别从这四个方面介绍现在比较流行的管理平台。 图片108091 50.2 KB 测试用例管理平台…

Doris 使用记录(随机更新(ง •_•)ง)

文章目录知识点常见数据分布方式使用表动态分区Hash分桶知识点 常见数据分布方式 分布式数据库中常见的数据分布方式。 轮询&#xff1a;Round-Robin&#xff0c;假设分桶数为3&#xff0c;数据按顺序依次写入桶1、桶2、桶3&#xff0c;然后继续循环。 区间&#xff1a;Ran…

【Lp-CVT and Applications】

Lp-CVT and Applications 论文笔记 本文是论文 Lp Centroidal Voronoi Tessellation and its Applications 的学习笔记。有不足之处&#xff0c;请指出&#xff01;非常感谢&#xff01; 1 主要工作 解决问题&#xff1a;推广CVT以适用各向异性和六面体网格划分。推广 CVT &am…

如何模拟实现一个“缓存”?

目录 前言 一、LRU Cache是什么 二、模拟实现 2.1、通过继承 LinkedHashMap 模拟实现 2.2、自主模拟实现LRU Cache 2.2.1、LRU Cache的定义 2.2.2、存放结点 2.2.3、访问结点 2.2.4、LRU Cache 完整模拟代码 小结 前言 这次主要实现一个类似缓存的一种数据结构&#xf…

day49 业务逻辑水平垂直越权访问控制脆弱验证

前言&#xff1a; #知识点&#xff1a; 1、水平越权-同级用户权限共享 2、垂直越权-低高用户权限共享 3、访问控制-验证丢失&取消验证 4、脆弱验证-Cookie&Token&Jwt等 #前置知识&#xff1a; 1、逻辑越权原理- -水平越权&#xff1a;用户信息获取时未对用户…

NTP(Network Time Protocol)协议详解

一、NTP的基本概念&#xff1a; NTP(Network Time Protocol)------网络时间协议-----应用层协议&#xff0c;用来在分布式时间服务器和客户端之间进行时间同步。 二、采用NTP的目的&#xff1a; 是对网络内所有具有时钟的设备进行时钟同步&#xff0c;使网络内所有设备的时钟…

JDY-06蓝牙透传无天线模块介绍

JDY-06蓝牙透传无天线模块简介JDY-06透传模块是基于蓝牙4.0协议标准&#xff0c;工作频段为2.4GHZ范围&#xff0c;调制方式为GFSK&#xff0c;最大发射功率为0db&#xff0c;最大发射距离60米&#xff0c;采用TICC2541芯片设计&#xff0c;支持用户通过AT命令修改设备名、服务…

Alkyne maleimide,Mal-Alkyne,炔烃-马来酰亚胺

中英文别名&#xff1a;CAS号&#xff1a;N/A | 英文名&#xff1a;Alkyne maleimide&#xff0c;Mal-Alkyne |中文名&#xff1a;炔烃-马来酰亚胺物理参数&#xff1a;CASNumber&#xff1a;N/AMolecular formula&#xff1a;C12H14N2O3Molecular weight&#xff1a;234.26Pur…

什么是前后端分离?

当前&#xff0c;数字化发展速度越来越快&#xff0c;前后端分离已经成为今后的发展趋势。在现代化办公管理中&#xff0c;不少企业倾向于使用低代码开发平台实现高效协作办公&#xff0c;那么&#xff0c;什么是前后端分离&#xff1f;都有哪些特点&#xff1f;本文就围绕这个…

【网络安全】渗透测试之linux信息收集

前言 在内网中linux的服务器是占大多数的&#xff0c;主要原因分为以下几点 1.便宜&#xff0c;linux大多为免费的&#xff0c;Windows Server是收费的&#xff0c;对于企业来说为了节约成本&#xff0c;大量采用linux服务器。 2.轻便&#xff0c;linux主要是对服务器进行服务的…

递归算法实例应用(三)

递归算法实例应用&#xff08;三&#xff09; 四则运算表达式求值 Description 给你一个字符串表达式 str &#xff0c;请你实现一个基本计算器来计算并返回它的值。 注意:不允许使用任何将字符串作为数学表达式计算的内置函数 。 Input 一行&#xff0c;一个四则运算表达…

编写设备驱动之i2c_client

编写设备驱动之i2c_client 文章目录编写设备驱动之i2c_client参考资料&#xff1a;一、I2C总线-设备-驱动模型二、 编译i2c_driver三、编写测试程序四、多种方法生成i2c_client并测试4.1 在用户态生成4.2 编写代码4.3 使用设备树生成2. IMX6ULL4.4 上机测试致谢参考资料&#x…

prometheus的remotewrite解析

特性 目的是为了向远端的存储写入数据。 为了提高写入效率&#xff0c;Prometheus在将采集到的samples写入远程存储之前&#xff0c;会先缓存在内存队列中&#xff0c;然后打包发送给远端存储。而这个内存队列的配置参数&#xff0c;对于Prometheus写入远程存储的效率影响较大…