体系班第十三节

news2024/11/17 5:21:13

1判断完全二叉树递归做法

有四种情况:1 左树完全,右数满,且左高为右高加一

2左满 ,右满,左高为右高加一

3左满,右完全,左右高相等

4左右均满且高相等

#include<iostream>
#include<algorithm>
using namespace std;
class TreeNode {
public:
	int val;
	TreeNode* left;
	TreeNode* right;
	TreeNode(int a) :val(a), left(nullptr), right(nullptr) {};
};
struct info {
	int height;
	bool iscbt;
	bool isfull;
	info(int a,bool b,bool c):height(a),iscbt(b),isfull(c){}
};
info process(TreeNode* head)
{
	if (head == nullptr)
		return info(0, true, true);
	info leftinfo = process(head->left);
	info rightinfo = process(head->right);
	int height = max(leftinfo.height, rightinfo.height) + 1;
	bool isfull = leftinfo.isfull && rightinfo.isfull && leftinfo.height == rightinfo.height;
	bool iscbt = false;
	if (leftinfo.isfull && rightinfo.isfull && leftinfo.height - rightinfo.height == 1)
		iscbt = true;
	if (leftinfo.isfull && rightinfo.isfull && leftinfo.height ==rightinfo.height )
		iscbt = true;
	if (leftinfo.iscbt && rightinfo.isfull && leftinfo.height - rightinfo.height == 1)
		iscbt = true;
	if (leftinfo.isfull && rightinfo.iscbt && leftinfo.height == rightinfo.height)
		iscbt = true;
	return info(height, iscbt, isfull);
}
bool iscbt(TreeNode* head)
{
	if (head == nullptr)
		return true;
	return process(head).iscbt;
}

2 给定一棵二叉树的头节点head,返回这颗二叉树中最大的二叉搜索子树的头节点

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class TreeNode {
public:
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int data) : val(data), left(nullptr), right(nullptr) {}
};
struct info {
    TreeNode* node;//最大搜索子树头结点
    int maxsize;
    int min;
    int max;
    info(TreeNode *a,int b,int c,int d):node(a),maxsize(b),min(c),max(d){}
};
info* process(TreeNode* head)
{
    if (head == nullptr)
        return nullptr;
    info* leftinfo = process(head->left);
    info* rightinfo = process(head->right);
    int maxval = head->val;
    int minval = head->val;
    TreeNode* ans = nullptr;
    int size = 0;
    if (leftinfo != nullptr)
    {
        maxval = max(maxval, leftinfo->max);
        minval = min(minval, leftinfo->min);
        ans = leftinfo->node;
        size = leftinfo->maxsize;
    }
    if (rightinfo != nullptr)
    {
        maxval = max(maxval, rightinfo->max);
        minval = min(minval, rightinfo->min);
        if (rightinfo->maxsize > size)
        {
            ans = rightinfo->node;
            size = rightinfo->maxsize;
        }
    }
    //当能构成搜索二叉树时
    if((leftinfo==nullptr?true:(leftinfo->node==head->left&&leftinfo->max<head->val))
        && (rightinfo == nullptr ? true : (rightinfo->node == head->right && rightinfo->min > head->val)))
    {
       ans=head;
       //一定要记得判空
       size = (leftinfo == nullptr ? 0 : leftinfo->maxsize) + (rightinfo == nullptr ? 0 : leftinfo->maxsize) + 1;
    }
    return new info(ans, size, minval, maxval);
}
TreeNode* maxSubBSTHead2(TreeNode* head)
{
    if (head == nullptr)
        return nullptr;
    return process(head)->node;
}

3给定一棵二叉树的头节点head,和另外两个节点a和b,返回a和b的最低公共祖先

法1:用哈希表记下所有节点父节点,将一个节点不停地向上,这其中经过的节点放入一个集合中

再在另一个节点从上遍历,一遍查找是否在集合中已经存在过,找到的第一个即为答案

#include <iostream>
#include <unordered_map>
#include <unordered_set>
using namespace std;
class TreeNode {
public:
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int data) : val(data), left(nullptr), right(nullptr) {}
};
void fillmap(TreeNode* head, unordered_map<TreeNode*, TreeNode*> &map)
{
    if (head->left != nullptr)
    {
        map[head->left] = head;
        fillmap(head->left, map);
    }
    if (head->right != nullptr)
    {
        map[head->right] = head;
        fillmap(head->right, map);
    }
}
TreeNode* lowestAncestor(TreeNode* head, TreeNode* p, TreeNode* q)
{
    if (head == nullptr)
        return nullptr;
    unordered_map<TreeNode*, TreeNode*> map;//记录所有节点的父节点
    map[head] = nullptr;
    fillmap(head,map);
    unordered_set<TreeNode*> set;
    TreeNode* cur = p;
    set.insert(cur);
    while (map[cur] != nullptr)
    {
        cur = map[cur];
        set.insert(cur);
    }
    cur = q;
    while (set.find(cur) == set.end())
    {
        cur = map[cur];
    }
    return cur;
}

法二:递归套路,会聚点与x有关还是无关:无关:已经在左或右树右答案,或这棵树a,b没找全

x是答案:左发现一个,右发现一个

x本身就是a,然后左右发现了b   x本身就是b,左右发现a

#include <iostream>
using namespace std;

// 节点类
class Node {
public:
    int value;
    Node* left;
    Node* right;

    Node(int data) : value(data), left(nullptr), right(nullptr) {}
};
// 最低公共祖先函数
Node* lowestAncestor2(Node* head, Node* a, Node* b) {
    return process(head, a, b).ans;
}

// 信息结构体
struct Info {
    bool findA;
    bool findB;
    Node* ans;

    Info(bool fA, bool fB, Node* an) : findA(fA), findB(fB), ans(an) {}
};

// 处理函数
Info process(Node* x, Node* a, Node* b) {
    if (x == nullptr) {
        return Info(false, false, nullptr);
    }

    Info leftInfo = process(x->left, a, b);
    Info rightInfo = process(x->right, a, b);

    bool findA = (x == a) || leftInfo.findA || rightInfo.findA;//不要忘了x本身就是a的情况
    bool findB = (x == b) || leftInfo.findB || rightInfo.findB;
    Node* ans = nullptr;

    if (leftInfo.ans != nullptr) {
        ans = leftInfo.ans;
    }
    else if (rightInfo.ans != nullptr) {
        ans = rightInfo.ans;
    }
    else {
        if (findA && findB) {
            ans = x;
        }
    }

    return Info(findA, findB, ans);
}

4  派对的最大快乐值
 员工信息的定义如下:
class Employee {
    public int happy; // 这名员工可以带来的快乐值
    List<Employee> subordinates; // 这名员工有哪些直接下级
}
公司的每个员工都符合 Employee 类的描述。整个公司的人员结构可以看作是一棵标准的、 没有环的多叉树
树的头节点是公司唯一的老板,除老板之外的每个员工都有唯一的直接上级
叶节点是没有任何下属的基层员工(subordinates列表为空),除基层员工外每个员工都有一个或多个直接下级
这个公司现在要办party,你可以决定哪些员工来,哪些员工不来,规则:
1.如果某个员工来了,那么这个员工的所有直接下级都不能来
2.派对的整体快乐值是所有到场员工快乐值的累加
3.你的目标是让派对的整体快乐值尽量大
给定一棵多叉树的头节点boss,请返回派对的最大快乐值。

分情况:x来,x不来,定义一个结构体,保存两个值,x来时候的最大值,x不来时候的最大值

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct employee {
	int happy;
	vector<employee*> nexts;
	employee(int h):happy(h),nexts(){}
};
struct info {
	int yes;
	int no;
	info(int a,int b):yes(a),no(b){}
};
info process(employee* head)
{
	if (head == nullptr)
		return info(0, 0);
	int yes = head->happy;
	int no = 0;
	for (employee* a : head->nexts)
	{
		info nextinfo = process(a);
		yes += nextinfo.no;
		no += max(nextinfo.yes, nextinfo.no);
	}
	return info(yes, no);
}
int maxhappy(employee* head)
{
	info allinfo = process(head);
	return max(allinfo.no, allinfo.yes);
}

5给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中字典序最小的结果

贪心:局部最小得全体最优解,有时候可能会有错

 字典序:字符串排大小,长度一样比数字大小

长度不同:较短的补上最小的阿斯克码值,然后与长的比较

证明过程:得先证明排序过程具有传递性 ,像石头剪刀布就没有传递性

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class compare {
public:
	bool operator()(string a, string b)
	{
		return (a + b) < (b + a);
	}
};
string lowestString(vector<string> str)
{
	if (str.empty())
		return "";
	sort(str.begin(), str.end(), compare());
	string a="";
	for (string c : str)
	{
		a += c;
	}
	return a;
}

 

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

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

相关文章

外边距折叠的原因和解决

参考文章 什么时候出现外边距塌陷 外边距塌陷&#xff0c;也叫外边距折叠&#xff0c;在普通文档流中&#xff0c;在垂直方向上的2个或多个相邻的块级元素&#xff08;父子或者兄弟&#xff09;外边距合并成一个外边距的现象&#xff0c;不过只有上下外边距才会有塌陷&#x…

Guiding Large Language Models viaDirectional Stimulus Prompting

1. 通过定向刺激提示指导大语言模型 论文地址&#xff1a;[2302.11520] Guiding Large Language Models via Directional Stimulus Prompting (arxiv.org) 源码地址&#xff1a;GitHub - Leezekun/Directional-Stimulus-Prompting: [NeurIPS 2023] Codebase for the paper: &qu…

[mmucache]-ARMV8-aarch64的虚拟内存(mmutlbcache)介绍-概念扫盲

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 思考: 1、cache的entry里都是有什么&#xff1f; 2、TLB的entry里都是有什么? 3、MMU操作…

保持长期高效的七个法则(一)7 Rules for Staying Productive Long-Term(1)

Easily the best habit I’ve ever started was to use a productivity system.The idea is simple:organizing all the stuff you need to do (and how you’re going to do it) prevents a lot of internal struggle to get things done. 无疑&#xff0c;我曾经建立过的最好…

简单了解TCP/IP四层模型

什么是计算机网络&#xff1f; 计算机网络我们可以理解为一个巨大的城市地图&#xff0c;我们想从A地前往B地&#xff0c;其中要走的路、要避开的问题都交给计算机网络解决&#xff0c;直到我们可以正常的到达目的地&#xff0c;那么我们会把其中的过程抽象成一个网络模型&…

分布式执行引擎ray入门--(3)Ray Train

Ray Train中包含4个部分 Training function: 包含训练模型逻辑的函数 Worker: 用来跑训练的 Scaling configuration: 配置 Trainer: 协调以上三个部分 Ray TrainPyTorch 这一块比较建议直接去官网看diff&#xff0c;官网色块标注的比较清晰&#xff0c;非常直观。 impor…

APP2:android studio如何使用lombok

一、前言 不知道从哪个版本开始&#xff0c;android studio便无法在plugins中下载lombok了&#xff0c;有人说是内置了&#xff0c;好像有这么回事儿。我主要面临如下两个问题&#xff1a; 使用内置lombok&#xff0c;可以自动生成setter、setter、toString等。但是&#xff0…

政安晨:【深度学习处理实践】(五)—— 初识RNN-循环神经网络

RNN&#xff08;循环神经网络&#xff09;是一种在深度学习中常用的神经网络结构&#xff0c;用于处理序列数据。与传统的前馈神经网络不同&#xff0c;RNN通过引入循环连接在网络中保留了历史信息。 RNN中的每个神经元都有一个隐藏状态&#xff0c;它会根据当前输入和前一个时…

【QT+QGIS跨平台编译】之七十:【QGIS_Analysis跨平台编译】—【qgsrastercalcparser.cpp生成】

文章目录 一、Bison二、生成来源三、构建过程一、Bison GNU Bison 是一个通用的解析器生成器,它可以将注释的无上下文语法转换为使用 LALR (1) 解析表的确定性 LR 或广义 LR (GLR) 解析器。Bison 还可以生成 IELR (1) 或规范 LR (1) 解析表。一旦您熟练使用 Bison,您可以使用…

free pascal 调用 C#程序读 Freeplane.mm文件,生成测试用例.csv文件

C# 请参阅&#xff1a;C# 用 System.Xml 读 Freeplane.mm文件&#xff0c;生成测试用例.csv文件 Freeplane 是一款基于 Java 的开源软件&#xff0c;继承 Freemind 的思维导图工具软件&#xff0c;它扩展了知识管理功能&#xff0c;在 Freemind 上增加了一些额外的功能&#x…

构建LVS集群

一、集群的基本理论&#xff08;一&#xff09;什么是集群 人群或事物聚集&#xff1a;在日常用语中&#xff0c;群集指的是一大群人或事物密集地聚在一起。例如&#xff0c;“人们群集在广场上”&#xff0c;这里的“群集”是指大量人群聚集的现象。 计算机技术中的集群&…

吴恩达机器学习-可选实验室:逻辑回归(Logistic Regression))

在这个不评分的实验中&#xff0c;你会探索sigmoid函数(也称为逻辑函数)探索逻辑回归;哪个用到了sigmoid函数 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from plt_one_addpt_onclick import plt_one_addpt_onclick from lab_utils_common impor…

批量提取PDF指定区域内容到 Excel 以及根据PDF里面第一页的标题来批量重命名-附思路和代码实现

首先说明下&#xff0c;PDF需要是电子版本的&#xff0c;不能是图片或者无法选中的那种。 需求1&#xff1a;假如我有一批数量比较多的同样格式的PDF电子文档&#xff0c;需要把特定多个区域的数字或者文字提取出来 需求2&#xff1a;我有一批PDF文档&#xff0c;但是文件的名…

【CSP试题回顾】202006-1-线性分类器

CSP-202006-1-线性分类器 解题思路 线性分类问题&#xff0c;即根据给定的数据点和分类界限&#xff0c;判断是否存在一条线能够将属于不同类别的点完全分开。具体来说&#xff0c;数据点被分为两类&#xff0c;标记为A和B&#xff0c;我们要找出是否存在一个线性决策边界&…

神经网络实战前言

应用广泛 从人脸识别到网约车&#xff0c;在生活中无处不在 未来可期 无人驾驶技术便利出行医疗健康改善民生 产业革命 第四次工业革命——人工智能 机器学习概念 机器学习不等价与人工智能20世纪50年代&#xff0c;人工智能是说机器模仿人类行为的能力 符号人工智能 …

官方安装配置要求服务器最低2核4G

官方安装配置要求服务器至少2核、4G。 如果服务器低于这个要求&#xff0c;就没有必要安装&#xff0c;因为用户体验超级差。 对于服务器CPU来说&#xff0c;建议2到4核就完全足够了&#xff0c;太多就浪费了&#xff0c;但是内存越大越好&#xff0c;最好是4G以上。 如果服务器…

XSS攻击场景分析

XSS攻击场景分析 在目前这个时间节点还是属于一个排位比较高的漏洞&#xff0c;在OWASP TOP10 2021中隶属于注入型漏洞&#xff0c;高居TOP3的排位&#xff0c;可见这个漏洞的普遍性。跨站脚本攻击的学习中我们主要需要明白的是跨站的含义&#xff0c;以及XSS的核心。XSS主流分…

CentOS 7安装MySQL及常见问题与解决方案(含JDBC示例与错误处理)

引言 MySQL是一个流行的开源关系型数据库管理系统&#xff0c;广泛应用于各种业务场景。在CentOS 7上安装MySQL后&#xff0c;我们通常需要使用JDBC&#xff08;Java Database Connectivity&#xff09;连接MySQL进行后端操作。 目录 引言 CentOS 7安装MySQL 使用JDBC连接My…

LLM Drift(漂移), Prompt Drift Cascading(级联)

原文地址&#xff1a;LLM Drift, Prompt Drift & Cascading 提示链接可以手动或自动执行&#xff1b;手动需要通过 GUI 链构建工具手工制作链。自治代理在执行时利用可用的工具动态创建链。这两种方法都容易受到级联、LLM 和即时漂移的影响。 2024 年 2 月 23 日 在讨论大型…

Java对接(BSC)币安链 | BNB与BEP20的开发实践(二)BNB转账、BEP20转账、链上交易监控

上一节我们主要是环境搭建&#xff0c;主要是为了能够快速得去开发&#xff0c;有些地方只是简单的介绍&#xff0c;比如ETH 、web3j等等这些。 这一节我们来用代码来实现BNB转账、BEP20转账、链上交易监控 话不多说&#xff0c;我们直接用代码实现吧 1. BNB转账 /*** BNB转…