力扣2月最后三天的每日一题

news2024/11/16 10:18:22

力扣2月最后三天的每日一题

  • 前言
  • 2867.统计树中的合法路径数目
    • 思路
    • 确定1e5中的质数
    • 统计每个点的连接情况
    • 开始对质数点进行处理
    • 完整代码
  • 2673.使二叉树所有路径值相等的最小代价
    • 思路
    • 完整代码
  • 2581.统计可能的树根数目
    • 思路
    • 建立连通关系
    • 将猜测数组变为哈希表,方便查询
    • 利用dfs初始化根为0的猜测正确数量
    • 统计完整的结果


前言

不会做,全靠灵神的视频讲解

2867.统计树中的合法路径数目

思路

考虑质数节点,每个质数节点应该都有属于它自己的多个连通块,而每个连通块中存在的非质数路径那么就可以形成一条合法路径
在这里插入图片描述
所以我们需要去统计一个质数的连通块中有多少非质数的连通情况,最后结果相加即可
在这里插入图片描述

确定1e5中的质数

对于一个质数,其的倍数一定不是质数

    void checknp(bool* np)
    {
        np[1] = true;
        for(int i = 2;i*i<MX+1;i++)
        {
            for(j = i*i ;j <MX+1;j+=i)
            {
                if(!np[i])
                {
                    np[j] = true;
                }
            }
        }
    }

统计每个点的连接情况

根据传入参数edgs数组,可以得到每个点与哪些点连接

        vector<vector<int>> connect(n+1);
        for(auto edge : edges)
        {
            connect[edge[0]].push_back(edge[1]);
            connect[edge[1]].push_back(edge[0]);
        }

开始对质数点进行处理

我们需要用到记忆化搜索的技巧。当我们对一个非质数与哪些非质数连接情况进行讨论后,我们可以将结果存储,如果后面有质数节点也与该非质数节点连接,那么就可以直接使用了。

//记录返回值 和 记忆化存储非质数节点与多少个非质数节点连接
long long res = 0;
vector<int> mem(n+1);
for(int i = 1;i<n+1;i++)
{
	//如果是非质数,就可以跳过,因为我们只考虑质数的连通
	if(np[i]) continue;
	//记录连通数
	int sum = 0;
	//对i的连通点进行处理结果
	for(int j : connect[i])
	{
		//只考虑非质数的情况
		if(!np[j]) continue;
		//如果没有被搜索过
		if(mem[j] == 0)
		{
			//存储相互连接节点的数组清空
			nodes.clear();
			checknodes(j,-1,connect);
			//对于nodes数组里面的所有点,其连通点的个数都是nodes数组的长度
			for(int k : nodes)
			{
				mem[k] = nodes.size();
			}
		}
		//计算结果,质数i下面的j连通块
		res += mem[j] * sum;
		sum += mem[j];
	}
	//以质数为头的结果
	res += sum;
}

完整代码

const int MX = 1e5;
class Solution {
private:
    bool np[MX+1];
    vector<int> nodes;
public:
    void checknp(bool* np)
    {
        np[1] = true;
        for(int i = 2;i*i<MX+1;i++)
        {
            for(int j = i*i ;j <MX+1;j+=i)
            {
                if(!np[i])
                {
                    np[j] = true;
                }
            }
        }
    }

    void checknodes(int x,int fa,vector<vector<int>>& connect)
    {
        nodes.push_back(x);
        for(int y:connect[x])
        {
            if(y!=fa&&np[y])
            {
                checknodes(y,x,connect);
            }
        }
    }
public:
    long long countPaths(int n, vector<vector<int>>& edges) {
        checknp(np);
        vector<vector<int>> connect(n+1);
        for(auto edge : edges)
        {
            connect[edge[0]].push_back(edge[1]);
            connect[edge[1]].push_back(edge[0]);
        }
        //结果
        long long res = 0;
        //记忆化搜索
        vector<int> mem(n+1);
        for(int i = 1;i<n+1;i++)
        {
            if(np[i]) continue;
            //记录当前节点的连接数
            int sum = 0;
            for(int j : connect[i])
            {
                if(!np[j]) continue;
                //如果没被遍历过
                if(mem[j] == 0)
                {
                    nodes.clear();
                    checknodes(j,-1,connect);
                    //修改记忆存储结果
                    for(int k : nodes)
                    {
                        mem[k] = nodes.size();
                    }
                }
                //统计该连通块对结果的影响
                res += mem[j]*sum;
                sum += mem[j];
            }
            //已质数节点为头的情况
            res += sum;
        }
        return res;
    }
};

2673.使二叉树所有路径值相等的最小代价

思路

从叶子节点开始,计算根节点到该叶子节点的路径和,然后修改其中一个叶子节点使得和相等,由于只能增加,所以向大值修改。
修改完成后将该和返回给叶子节点的父节点,然后比较同一层级的父节点的和,进行修改。
逐步返回直到根节点

完整代码

对于满二叉树,父节点和左右子结点在数组中存在一个关系。

class Solution {
public:
    int minIncrements(int n, vector<int>& cost) {
        //统计每个节点的路径和
        for(int i = 2;i<n+1;i++)
        {
            cost[i-1] += cost[i/2-1];
        }
        //更新结果
        int res = 0;
        for(int i = n/2;i>0;i--)
        {
            res += abs(cost[2*i]-cost[2*i-1]);
            cost[i-1] = max(cost[2*i],cost[2*i-1]);
        }
        return res;
    }
};

2581.统计可能的树根数目

思路

还不是很明白
我们假设以0为根的正确猜测是cnt0,那调换到以1为根,那么cnt1的值
首先需要减去guesses数组[0,1]的数量,再加上[1,0]的数量,因为[u,v]表示u是v的父节点。
其余调换类似。

建立连通关系

vector<vector<int>> g(edges.size() + 1);
for (auto &e : edges) 
{
	int x = e[0], y = e[1];
	g[x].push_back(y);
	g[y].push_back(x);
}

将猜测数组变为哈希表,方便查询

unordered_set<LL> s;
for (auto &e : guesses) 
{ // guesses 转成哈希表
	s.insert((LL) e[0] << 32 | e[1]); // 两个 4 字节数压缩成一个 8 字节数
}

利用dfs初始化根为0的猜测正确数量

int ans = 0, cnt0 = 0;
function<void(int, int)> dfs = [&](int x, int fa) 
{
	//y与x连通
	for (int y : g[x])
	{
		//y不是父节点,防止反向计算
		if (y != fa) 
		{
			//[x,y]如果存在哈希表中,表面以0为根的结果猜测正确+1
			cnt0 += s.count((LL) x << 32 | y); // 以 0 为根时,猜对了
			//以当前节点为父节点搜索子结点
			dfs(y, x);
		}
	}
};
dfs(0, -1);

统计完整的结果

//计算以x为根的cnt
function<void(int, int, int)> reroot = [&](int x, int fa, int cnt) 
{
	ans += cnt >= k; // 此时 cnt 就是以 x 为根时的猜对次数
	for (int y : g[x]) 
	{
		if (y != fa) 
		{
		//从0开始,变换根为0的连通节点,在变换为连通节点的连通节点
			reroot(y, x, cnt
			- s.count((LL) x << 32 | y)   // 原来是对的,现在错了
			+ s.count((LL) y << 32 | x)); // 原来是错的,现在对了
		}
	}
};
reroot(0, -1, cnt0);

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

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

相关文章

RTF文件格式解析(二)图像问题

图片 一个RTF文件可以包含由其他应用创建的图象。这些图象可以是16进制(默认的)或2进制格式。图象属于目标引用&#xff0c;由\pict 控制字开始。如后面的例子中将描述的&#xff0c;\pict关键字应在\*\shppict引用控制关键字之后。一个图象引用具有如下语法&#xff1a; <p…

CSP-201912-2-回收站选址

CSP-201912-2-回收站选址 【50分思路-暴力枚举】 #include <iostream> #include <vector> #include <algorithm> using namespace std; struct trashPoint {int x; int y; }; vector<trashPoint>trashList; vector<int>grade(5); int main…

MySQL:使用聚合函数查询

提醒&#xff1a; 设定下面的语句是在数据库名为 db_book里执行的。 创建t_grade表 USE db_book; CREATE TABLE t_grade(id INT,stuName VARCHAR(20),course VARCHAR(40),score INT );为t_grade表里添加多条数据 INSERT INTO t_grade(id,stuName,course,score)VALUES(1,测试0…

1.QT简介(介绍、安装,项目创建等)

1. QT介绍 Qt&#xff08;官方发音 [kju:t]&#xff09;是一个跨平台的C开发库&#xff0c;主要用来开发图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;程序 Qt 是纯 C 开发的&#xff0c;正常情况下需要先学习C语言、然后在学习C然后才能使用…

JS reduce() 附使用详解

reduce() 方法对数组中的每个元素执行自己提供的回调函数(依次执行)&#xff0c;将其结果汇总为单个返回值。 文章目录 前言一、reduce()是什么&#xff1f;二、使用步骤1.语法2.实例解析 initialValue 参数3.注意事项4.应用情况 三、总结 前言 reduce()方法可以搞定的东西特别…

使用MindOpt时常见的报错,以及对应的解决方法

本篇描述的license问题均为云鉴权的方式 执行 mindopt -c检查许可证的配置&#xff08;license文件&#xff09; 许可证过期 示例&#xff1a; 解决方法&#xff1a; 在控制台中续费即可 并发不够&#xff08;409&#xff09;&#xff0c;以及两个 WARN提示 示例&#xff1…

【前端素材】推荐优质在线高端蜂蜜商城电商网页Beejar平台模板(附源码)

一、需求分析 1、系统定义 在线高端蜂蜜商城是指一个专门销售高品质、高端蜂蜜产品的电子商务平台。这种商城致力于向消费者提供各种经过精心挑选、具有高营养价值和健康功效的蜂蜜产品。 2、功能需求 在线高端蜂蜜商城是指一个专门销售高品质、高端蜂蜜产品的电子商务平台…

没有项目经历,该如何写简历?

没有项目经历&#xff0c;我该如何写简历 一、前言二、挖掘自己三、看现成的项目经验&#xff0c;转化成自己的语言1、硬件方面2、软件方面 四、最后 一、前言 相信有很多刚出来找工作的人会遇到这种情况&#xff0c;因为自身没有项目经历&#xff0c;投了很多的简历都石沉大海…

小甲鱼Python07 函数初级

一、创建和调用函数 pass语句表示一个空的代码块&#xff0c;我们经常先写好函数&#xff0c;pass占一个坑&#xff0c;等规划好之后再来填坑。 函数也是可以指定参数的&#xff0c;我们会把参数传进去用来替代形参。 在Python里如果想要返回值&#xff0c;不需要指定函数的返…

Redis 【1】—— 安装 与 配置

Redis 【1】—— 安装 与 配置 一、安装 与 配置&#xff08;一&#xff09;使用 yum 安装&#xff08;二&#xff09;创建符号链接1. 软链接2. 相关指令 &#xff08;三&#xff09;修改配置文件&#xff08;四&#xff09;Redis 的启停 一、安装 与 配置 &#xff08;一&…

【leetcode】反转链表

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 方法1 .将箭头方向逆转方法2. 点击查看题目 方法1 .将箭头方向逆转 思路&#xff1a; n1,n2,n3分别指…

Topaz Video AI:一键提升视频品质,智能重塑影像魅力 mac/win版

Topaz Video AI是一款革命性的视频智能处理软件&#xff0c;它利用先进的机器学习和人工智能技术&#xff0c;为视频创作者提供了前所未有的视频增强和修复功能。无论您是专业视频编辑师、摄影师&#xff0c;还是热爱视频创作的爱好者&#xff0c;Topaz Video AI都能帮助您轻松…

大数据分析案例-基于SVM支持向量机算法构建手机价格分类预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

React富文本编辑器开发(三)

现在我们的编辑器显示的内容很单一&#xff0c;这自然不是我们的目标&#xff0c;让呈现的内容多元化是我们的追求。这就需要让编辑器能够接收多元素的定义。从初始数据的定义我们可以推断数据的格式远不止一种&#xff0c;那么其它类型的数据如何定义及呈现的呢&#xff0c;我…

【 C++ 】智能指针

1、内存泄漏 什么是内存泄漏&#xff0c;内存泄漏的危害 什么是内存泄漏&#xff1a; 内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失&#xff0c;而是应用程序分配某段内存后&#xff0c;因为设计错误&#xff0c…

操作系统导论

操作系统的概念&#xff1a; 操作系统是管理计算机硬件的程序&#xff0c;它还为应用程序提供基础&#xff0c;并且充当计算机硬件和计算机用户之间的中介。 操作系统做什么&#xff1a; 计算机系统可以大致分为四个部分&#xff1a;硬件&#xff0c;操作系统&#xff0c;系…

kafka查看数据_Kafka 数据积压情况查看

由于消息消费速度处理慢或是消费端故障会导致数据产生积压。 那怎么查看数据积压量呢&#xff1f; Consumer-Groups管理&#xff1b; 在Kafka 的bin目录下提供了 kafka-consumer-groups.sh 脚本。此脚本用于管理消费情况。 查询消费者组 $KAFKA_DIR/bin/kafka-consumer-groups…

【Sql server】假设有三个字段a,b,c 以a和b分组,如何查询a和b唯一,但是c不同的记录

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

深入理解计算机系统笔记

1.1 嵌套的数组 当我们创建数组的数组时&#xff0c;数组分配和引用的一般原则也是成立的。 例如&#xff0c;声明 int A[5][3]; 等价于下面的声明 typedef int row3_t[3]; row3_t A[5] 要访问多维数组的元素&#xff0c;编译器会以数组起始为基地址&#xff0c; (可能需…

教你快速认识Java中的继承和多态

目录 继承 继承的概念 继承的语法 父类成员访问 在子类方法中或者通过子类对象访问父类成员变量时&#xff1a; 在子类方法中或者通过子类对象访问父类成员方法时&#xff1a; super关键字 子类构造方法&#xff1a; 代码块执行顺序: 多态 多态的实现条件 重写 重…