leetCode周赛-317

news2024/11/18 7:46:38

这里写目录标题

  • 题目一:6220.可被三整除的偶数的平均值
  • 题目二:6221. 最流行的视频创作者
  • 题目三:6222. 美丽整数的最小增量
  • 题目四:2458. 移除子树后的二叉树高度

题目一:6220.可被三整除的偶数的平均值

AC代码:

class Solution {
public:
    int averageValue(vector<int>& nums) {
        int sum=0;
        int len=nums.size();
        int n=0;
        for(int i=0;i<len;i++)
        {
            if(nums[i]%3==0&&nums[i]%2==0)
            {
                sum+=nums[i];
                n++;
            }
        }
        if(n==0) return 0;
        sum=sum/n;
        return sum;
    }
};

题目二:6221. 最流行的视频创作者

熟悉map和vector的使用和嵌套使用即可
注意常用的避免超时的方法:先将后面需要用到的信息存起来,避免不必要的遍历(创作者对应的视频)
AC代码:

class Solution {
public:
    vector<vector<string>> mostPopularCreator(vector<string>& creators, vector<string>& ids, vector<int>& views) {
        vector<vector<string>> ans;
        int lenc=creators.size();
        int leni=ids.size();
        map<string,long long>tmp;
        map<string,vector<int>>index; //将每个创作者的所有视频的编号存起来,便于后面对最大流行度作者进行处理的时候直接输出,就不用遍历所有的视频去匹配了,那样会超时
        for(int i=0;i<lenc;i++)
        {
            tmp[creators[i]]+=views[i];
           
            index[creators[i]].push_back(i);
        }
        
        long long max=0;
        vector<string>maxName;
        for(map<string,long long>::iterator it=tmp.begin();it!=tmp.end();it++)
        {
            if(it->second>max) max=it->second;
        }
        for(map<string,long long>::iterator it=tmp.begin();it!=tmp.end();it++)
        {
            if(it->second==max) maxName.push_back(it->first);
        }
    
        for(int i=0;i<maxName.size();i++)
        {
            string name=maxName[i];
            string maxids="";
            max=0;
            int lenindex=index[name].size();
            for(int k=0;k<lenindex;k++)
            {
                int j=index[name][k];
                if(maxids=="") maxids=ids[j];
                if(views[j]>max)
                {
                    max=views[j];
                    maxids=ids[j];
                }
                else if(views[j]==max)
                {
                    if(maxids>ids[j])  //选取字典序更小的
                         maxids=ids[j];
                }
            }
            vector<string>t;
            t.push_back(name);
            t.push_back(maxids);
            ans.push_back(t);
        }
        return ans;
    }
};

题目三:6222. 美丽整数的最小增量

一开始用暴力试了试,虽然自己分析的也会超时,但是还是试了试,果然超时了,比如一个数为2*10^ 12,target为1,一个一个地加需要执行8 *10^12,肯定超时了
静下心来想一下,一个数的每个位数和加起来大于target了,只可能将低位的减小,不可能将高位的进行减小(右低左高),因为需要将数增大
要想加得数最少就能达到要求,肯定是从低位到高位开始逐渐减小,对于每一个低位只能直接减小到0,然后向高一位进位,不可能取小于该数的其他数字,因为要想减小必定会向高位进一位,进一位后最小的数就是取0在这里插入图片描述
注意如果用数组来保存每一位是不太好的,涉及进位要不断向高位进位,不好操作,直接利用取余和除法运算来操作
在这里插入图片描述

class Solution {
public:
    int getIndex(long long tmp,int index) //返回tmp的第index位数 
    {
        long long t=pow(10,index-1);
        if(t%10&&t!=1) t++;  //这个地方有时候pow后得到的是99,不知道为什么
        tmp=tmp/t;
        tmp=tmp%10;
        return tmp;
    }
    int getSum(long long tmp,int index) //得到tmp第index位到最高位的和
    {
        long long t=pow(10,index-1);
        if(t%10&&t!=1) t++;
        tmp=tmp/t;  //剔除掉前面的
        int sum=0;
        while(tmp)
        {
            sum+=tmp%10;
            tmp/=10;
        } 
        return sum;
    }
    long long makeIntegerBeautiful(long long n, int target) {
        unsigned long long tmp=n;  //这个地方在后面进行加和的时候用long long会超出范围,直接改为unsigned long long
        int index=1;
        while(true)  
        {
            int sum=getSum(tmp,index);
            if(sum<=target) break;
            int t=getIndex(tmp,index);  //得到第index位 
            tmp-=t*pow(10,index-1); //将第index位置为0 
            tmp+=pow(10,index); //进位
            
            index++;  //处理下一位
        }
        tmp-=n;
        return tmp;
    }
};

题目四:2458. 移除子树后的二叉树高度

部分通过:
自己写的只能通过37 / 40 个通过测试用例,超时了,已经尽力了
思路就是,只有在每次删除某个子树的时候,对应子树的根节点是在重链上,也就是在删除了某些结点后会影响树的高度的对应的结点,重链上的结点也就是在计算树的高度的时候每次左子树和右子树中根节点值最大的子树的根节点(如果俩子树的高度相同,对应的根节点也不是重链上的结点),因此在删除的时候可以判断一下,如果删除的不是重链上的结点,就不会影响树原本的高度,如果删除的是重链上的结点,就需要重新进行计算

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
     //求解树的高度过程中经过的那些结点的编号,只有这些结点被删除才会影响树的高度(这些结点经过的链路称为重链)
    set<int>zhongNum;             //存储重链上的结点
    map<TreeNode*,int>NodeDeep;   //每个结点作为根节点的树的高度
    int deepAns[100005];   //重链上的结点被删掉后树的高度是多少
    int getDeep(TreeNode* root)
    {
        if(root==nullptr) return 0;
        int l=getDeep(root->left);
        int r=getDeep(root->right);
        if(l>r) 
        {
            //把删去后影响树高度的结点存起来
            zhongNum.insert(root->left->val);
        }
        else if(l<r) 
        {
            zhongNum.insert(root->right->val);
        }
        NodeDeep[root]=max(l,r)+1;      //保存每个结点最为根节点的子树的高度
        return max(l,r)+1;
    }
    int dfs(TreeNode* root,int p)
    {
        if(root->val==p) return 0;   //找到删除的子树的根节点(重链上的结点)就停止往下继续算
        if(root->left&&zhongNum.count(root->left->val))    
        {
            if(root->right) return max(dfs(root->left,p),NodeDeep[root->right])+1;
            else return dfs(root->left,p)+1;
        } 
        else if(root->right&&zhongNum.count(root->right->val)) 
        {
            if(root->left) return max(dfs(root->right,p),NodeDeep[root->left])+1;
            else return dfs(root->right,p)+1;
        }
        else return NodeDeep[root];
    }
    //删掉重链上的结点后树的高度是多少
    void solve(TreeNode* root)
    {
        for(set<int>::iterator it=zhongNum.begin();it!=zhongNum.end();it++)
        {
            int ans=dfs(root,(*it));
            deepAns[(*it)]=ans-1;
        }
    }
    vector<int> treeQueries(TreeNode* root, vector<int>& queries) {
        int len=queries.size();
        int maxDeep=getDeep(root)-1;
        solve(root);   //求树的高度,顺便求重链上的结点,顺便求每个结点作为根节点的子树的高度
      
        for(int i=0;i<len;i++)
        {
            if(!zhongNum.count(queries[i]))  //删除的不是重链上的结点,不会改变树的高度
            {
                queries[i]=maxDeep;
            }
            else queries[i]=deepAns[queries[i]];  //删除重链上的结点树的高度要重新dfs来求
        }
        return queries;
    }
};

其实超时的原因就出在遍历每个重链上的结点,求将该结点删除后整棵树的高度上,外层遍历,内层又dfs,就超时了,想着把这个外层的遍历去掉
再想一下,可以从上往下沿着重链走的过程中就能求出将每个重结点删去后的树的高度,当到达一个重结点时,就表示将该重结点删掉,将该重结点删掉后树的高度为他父节点的到根节点的高度加上它父节点的另一个子树的高度和该树将它父节点删掉后的树的高度二者的最大值,因为是从上往下遍历的,因此每次都会先把该重结点的父节点(也是重结点)删除后的树的高度求出来,直接往下不断循环迭代就行。
AC代码:
在这里插入图片描述


class Solution {
public:
     //求解树的高度过程中经过的那些结点的编号,只有这些结点被删除才会影响树的高度(这些结点经过的链路称为重链)
    map<TreeNode*,TreeNode*>zhongNum;             //存储每个结点的重儿子
    map<TreeNode*,int>NodeDeep;   //每个结点作为根节点的树的高度
    int deepAns[100005];   //每个结点被删掉后树的高度是多少
    int getDeep(TreeNode* root)
    {
        if(root==nullptr) return 0;
        int l=getDeep(root->left);
        int r=getDeep(root->right);
        if(l>r) 
        {
            //把删去后影响树高度的结点存起来
            zhongNum[root]=root->left;
        }
        else if(l<r) 
        {
            zhongNum[root]=root->right;
        }
        NodeDeep[root]=max(l,r)+1;      //保存每个结点最为根节点的子树的高度
        return max(l,r)+1;
    }
   
    //删掉重链上的结点后树的高度是多少,从根节点往下,遍历每个重链上的结点被删除后树的高度是多少
    void solve(TreeNode* root)
    {
        TreeNode* now =zhongNum[root];
        TreeNode* fa=root;
        int path =-1,maxd=0;
        while(now)   //当还有重儿子,注意当两棵子树对应的高度都相同的时候该结点也是没有重儿子的
        {
            path++;
            int other=0;   //不是重儿子的另一个儿子作为子树的高度
            if(fa->right&&now==fa->left)  other=NodeDeep[fa->right];
            else if(fa->left&&now ==fa->right) other=NodeDeep[fa->left];
            maxd=max(maxd,other+path);
            //cout<<now->val<<" "<<maxd<<endl;
            deepAns[now->val]=maxd;
            fa=now;
            now=zhongNum[fa];
        }
    }
    vector<int> treeQueries(TreeNode* root, vector<int>& queries) {
        int len=queries.size();
        int maxDeep=getDeep(root)-1;
        for(int i=0;i<len;i++)
        {
            deepAns[queries[i]]=maxDeep;   //先给所有的结点值的高度都赋值为不是重链上的结点删去后的高度,后面再更新重链上的结点
        }
        solve(root);   //求重链上的结点删去后树的高度
        for(int i=0;i<len;i++)
        {
            queries[i]=deepAns[queries[i]];
        }
        return queries;
    }
};

严总的直接存树中结点值的方法:(因为每个结点是1-n并且不重复的数,这样会简单一些,用0表示左孩子,1表示右孩子) 而且时间复杂度减小了好多
在这里插入图片描述

const int N=100010;

class Solution {
public:
    int son[N];             //存储每个结点的重儿子是左儿子(0)还是右儿子(1),如果没有重儿子即为(-1)
    int tr[N][2];           //每个结点的左儿子存在tr[i][0],右儿子存在tr[i][1]
    int NodeDeep[N];        //每个结点作为根节点的树的高度
    int deepAns[N];   //每个结点被删掉后树的高度是多少
    int getDeep(TreeNode* root)
    {
        if(root==nullptr) return 0;
        int l=getDeep(root->left);
        int r=getDeep(root->right);
        int v=root->val;
        if(l) tr[v][0]=root->left->val;
        if(r) tr[v][1]=root->right->val;
        if(l>r) son[v]=0;  //重儿子是左儿子
        else if(l<r) son[v]=1;  //重儿子是右儿子
        NodeDeep[root->val]=max(l,r)+1;      //保存每个结点最为根节点的子树的高度
        return max(l,r)+1;
    }
   
    //删掉重链上的结点后树的高度是多少,从根节点往下,遍历每个重链上的结点被删除后树的高度是多少
    void solve(TreeNode* root)
    {
        int now =root->val;    //now=0表示左儿子为重儿子,now=1表示右儿子为重儿子,now=-1表示没有重儿子
        int path =-1,maxd=0;
        while(now&&son[now]!=-1)   //当还有重儿子
        {
            path++;
            int k=son[now];  //得到重儿子
            maxd=max(maxd,NodeDeep[tr[now][k ^ 1]]+path); //异或得到另一个儿子,如果当前儿子是左儿子0,异或后得到另一个儿子1
            deepAns[tr[now][k]]=maxd;
            now=tr[now][k];   //转移到重儿子上去
        }
    }
    vector<int> treeQueries(TreeNode* root, vector<int>& queries) {

        // memset(tr,0,sizeof tr);   //注意这个数组放在类的外面,即全局作用域中是随机初始化的,要进行手动初始化,作为成员变量时会用默认0,null等初始化
        // memset(son, -1,sizeof son);

        int len=queries.size();
        int maxDeep=getDeep(root)-1;

        //先给所有的结点值的高度都赋值为不是重链上的结点删去后的高度,后面再更新重链上的结点
        for(int i=0;i<len;i++)  deepAns[queries[i]]=maxDeep; 
      
        solve(root);   //求重链上的结点删去后树的高度
        for(int i=0;i<len;i++)
        {
            queries[i]=deepAns[queries[i]];
        }
        return queries;
    }
};

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

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

相关文章

考研数学练习题-2022年12月23日

日期&#xff1a;2022年12月23日 数量&#xff1a;10

deck.gl 调研

0 结论 deck gl 是基于 WebGL 的数据可视化框架&#xff0c;可以集成在主流的地图框架&#xff08;arcgis&#xff0c;google maps&#xff0c;mapbox &#xff09;中使用&#xff0c; 也可以单独使用。 deck gl 通过layer进行数据可视化&#xff0c;支持多种展示效果&#xf…

什么是网络监控?OpManager 网络监控解决方案

什么是网络监控 在当今世界&#xff0c;术语网络监控在整个IT行业中很普遍。网络监控是一个关键的 IT 过程&#xff0c;其中所有网络组件&#xff08;如路由器、交换机、防火墙、服务器和虚拟机&#xff09;都受到故障和性能监控&#xff0c;并持续评估以维护和优化其可用性。…

基于防火墙双击热备三层网络规划_ensp综合实验

作者&#xff1a;BSXY_19计科_陈永跃BSXY_信息学院注&#xff1a;未经允许禁止转发任何内容基于防火墙双击热备三层网络规划_ensp综合实验前言及技术/资源下载说明&#xff08; **未经允许禁止转发任何内容** &#xff09;插曲&#xff1a;基于eNSP中大型校园/企业网络规划与设…

聊聊首次使用航顺HK32F030C8T6的体验

先说结论&#xff0c;项目基本上开发测试完成了,mcu运行正常。 这个项目是一个智能家居的项目&#xff0c;主板和副板都使用了HK32F030C8T6&#xff0c;这也是笔者第一次使用航顺的芯片。 关于这个芯片的资料&#xff0c;从官网只能下载到datasheet和user mannal的pdf文档&am…

代码随想录训练营第59天|LeetCode 503.下一个更大元素II、42. 接雨水

参考 代码随想录 题目一&#xff1a;LeetCode 503.下一个更大元素II 这个题在496. 下一个更大元素 I基础上数组变成了环&#xff0c;其实两次两次数组就可以了。代码如下&#xff1a; class Solution { public:vector<int> nextGreaterElements(vector<int>&am…

即时通讯实时视频聊天技术提供QoS保证的方法

随着WebRTC标准的逐步推广&#xff0c;实时音视频通讯技术受到越来越多公司和技术人员的关注。 对于交互式音视频应用而言&#xff0c;稳定、低延时、通话质量清晰可靠是其基本需求。在互联网环境下&#xff0c;音视频的通话质量与以下因素有关&#xff1a;一是编码码率、帧率和…

Opencv IplImage 和 Mat 使用介绍

1. IPIImage 使用介绍 IplImage是OpenCV中CxCore部分基础的数据结构&#xff0c;用来表示图像&#xff0c;其中Ipl是Intel Image Processing Library的简写。以下是IplImage的结构分析。参见:OpenCV中文网站 typedef struct _IplImage{int nSize; /* IplImage大小 *…

70页幻灯片图解“工信领域数据安全管理办法”等五部委数据法规

国家安全是民族复兴的根基。党的二十大报告指出&#xff0c;“加快建设制造强国、质量强国、航天强国、交通强国、网络强国、数字中国”、“推进国家安全体系和能力现代化”、“强化经济、重大基础设施、金融、网络、数据、生物、资源、核、太空、海洋等安全保障体系建设”。数…

02-redis篇 redis事务处理及使用方式

目录 1. 事务简介: -> 1.1 必须满足: ACID四个特性(原子性,一致性,隔离性,持久性) -> 1.2 简单理解: 一个业务,也可以看成是一个逻辑工作单元; 2. redis 操作事务的基本指令 -> 指令: -> 图式: 3. 模拟多事务操作(watch乐观锁) 3.1 不开启乐观锁watch操作…

Linux Python安装

1.到官网下载适合自己的版本 Python Source Releases | Python.orgThe official home of the Python Programming Languagehttps://www.python.org/downloads/source/2.下载好压缩包之后&#xff0c;将压缩包解压开 3.将开发环境的依赖包准备好 yum -y install zlib-devel bz…

阅读笔记 MulDA: DAGA向多语言方向的拓展

阅读笔记 MulDA: DAGA向多语言方向的拓展 文章目录阅读笔记 MulDA: DAGA向多语言方向的拓展前言概述IntroductionMulDA: Our Multilingual Data Augmentation Framework1、Labeled Sequence Translation2、Synthetic Data Generation with Language Models3、Semi-supervised M…

Tableau可视化设计案例-05Tableau进阶

文章目录Tableau可视化设计案例05Tableau进阶1.数据集合并1.1 数据导入界面1.2超市销售情况符号地图1.3智能显示1.4 仪表盘高级应用Tableau可视化设计案例 本文是Tableau的案例&#xff0c;为B站视频的笔记&#xff0c;B站视频 参考&#xff1a;https://www.bilibili.com/vide…

怎么使用CAM350检查Gerber?

文章目录什么是Gerber文件&#xff1f;Gerber中的文件由那些组成&#xff1f;怎么使用CAM350检查Gerber&#xff1f; ——导入CAM350的基础操作&#xff1a;对层的操作什么是Gerber文件&#xff1f; Gerber文件是设计完后PCB(brd文件)板文件后交给板厂制造成品的文件。Gerber一…

代码随想录刷题记录 day50 每日温度+下一个更大元素 I

代码随想录刷题记录 day50 每日温度下一个更大元素 I 739. 每日温度 思想 1.暴力解 两次for 超时了 2.单调栈 花了点时间理解的。 单调栈的基础入门题。找到一个数组中右边的第一个大于 等于 或者小于当前元素的下标的位置 以时间换空间&#xff0c;用一个栈来记录右边第…

明道云联合RestCloud打造APaaS+IPaaS融合解决方案

背景介绍 APaaSIPaaS发展趋势 随着企业规模的扩张以及业务需求变化越来越快&#xff0c;企业现有IT系统无法快速应对前端敏捷化的需求。企业IT架构将朝着敏捷化、低代码化、服务化方向发展&#xff0c;而APaaSIPaaS解决方案在这种需求下应运而生&#xff0c;IPaaS可以把现有固…

ARAS plm安装,各种踩坑

目录准备工作sql server安装NET Framework安装许可申请IIS服务开启IIS无法启动报错 HTTP 错误 500.19 - Internal Server Error错误变为 aras Error: Cannot access OAuth Server due to 500 (Internal Server Error)**Aras安装准备工作 sql server安装 登录出现的几个错误 s…

Python数据分析挖掘案例:Python爬虫助力疫情数据追踪

通过学习Python数据分析挖掘案例&#xff0c;可以掌握通过Python爬虫获取的数据进行处理以及可视化分析的主要方法和技能&#xff0c;并为后续相关课程学习及将来从事数据分析工作奠定基础。 新冠病毒疫情在武汉突然爆发&#xff0c;确诊病例、疑似病例、死亡病例等数据牵动着每…

Binary number

A binary number is a number expressed in the base-2 numeral system or binary numeral system, a method of mathematical expression which uses only two symbols: typically “0” (zero) and “1” (one). The base-2 numeral system is a positional notation with a…

5G FWA市场一跃而上,四信多款5G终端赋能FWA典型应用

随着国家政策相继出台&#xff0c;全球5G基础设施建设日益完善&#xff0c;带动千行百业的巨大变革。以工业互联网、远程医疗、车联网、消费级硬件等为例的应用场景均在5G加持下实现跨越式升级。与此同时&#xff0c;5G FWA作为弥合光纤欠发达地区数字鸿沟挑战的“杀手级应用”…