【复习30-35题】【每天40分钟,我们一起用50天刷完 (剑指Offer)】第二十一天 21/50

news2024/7/4 5:17:06

专注 效率 记忆
预习 笔记 复习 做题

欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
 
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
 
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!

本博客带大家一起学习,我们不图快,只求稳扎稳打。
由于我高三是在家自学的,经验教训告诉我,学习一定要长期积累,并且复习,所以我推出此系列。
只求每天坚持40分钟,一周学5天,复习2天
也就是一周学10道题
50天后我们就可以学完76道题,相信50天后,我们一定可以有扎实的代码基础!我们每天就40分钟,和我一起坚持下去吧!
qq群:866984458

本题出自 acwing网站
这个系列是免费的
打卡即刻退回费用。

第二十一天【剑指Offer例题代码 系列】

    • 30. 栈的压入、弹出序列
    • 31. 不分行从上往下打印二叉树( 层序遍历二叉树bfs )
    • 32. 分行从上往下打印二叉树( 利用两个队列遍历 )
    • 33. 之字形打印二叉树
    • 34. 二叉搜索树的后序遍历序列
        • 考点:根据二叉搜索树的后序遍历的特点
    • 35. 二叉树中和为某一值的路径( dfs回溯 )
        • 注意:只能是根节点到叶子节点

30. 栈的压入、弹出序列

原题链接

在这里插入图片描述

class Solution {
public:
    bool isPopOrder(vector<int> pushV,vector<int> popV) {
        if(popV.size() != pushV.size())
        {
            return false;
        }
        if(pushV.size()==0 && popV.size()==0)
            return true;
        stack<int> st;
        for(int i = 0,j = 0; i < popV.size(); i++)
        {
            if(popV[j]!=pushV[i])
            {
                st.push(pushV[i]);
            }
            else
            {
                st.push(pushV[i]);
                while(st.size() && j < popV.size() && st.top() == popV[j])
                {
                    st.pop();
                    j++;
                }
            }
        }
        if(st.size()==0)
            return true;
        return false;
    }
};

31. 不分行从上往下打印二叉树( 层序遍历二叉树bfs )

原题链接

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> printFromTopToBottom(TreeNode* root) {
        vector<int> ans;
        if(root==NULL)
            return ans;
        queue<TreeNode*> q;
        q.push(root);
        while(q.size())
        {
            auto t = q.front();
            q.pop();
            ans.push_back(t->val);
            
            if(t->left != NULL)
                q.push(t->left);
            if(t->right != NULL)
                q.push(t->right);
        }
        return ans;
    }
};

32. 分行从上往下打印二叉树( 利用两个队列遍历 )

原题链接

在这里插入图片描述
在这里插入图片描述

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> get_val(vector<TreeNode*> level)
    {
        vector<int> res;
        for (auto &u : level)
            res.push_back(u->val);
        return res;
    }

    vector<vector<int>> printFromTopToBottom(TreeNode* root) {
        vector<vector<int>>res;
        if (!root) return res;
        vector<TreeNode*>level;
        level.push_back(root);
        res.push_back(get_val(level));
        while (true)
        {
            vector<TreeNode*> newLevel;
            for (auto &u : level)
            {
                if (u->left) newLevel.push_back(u->left);
                if (u->right) newLevel.push_back(u->right);
            }
            if (newLevel.size())
            {
                res.push_back(get_val(newLevel));
                level = newLevel;
            }
            else break;
        }
        return res;
    }
};

33. 之字形打印二叉树

原题链接
在这里插入图片描述
本题和上一道题差不多
就是需要定义一个变量
判断是否需要翻转

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> get_val(vector<TreeNode*> level)
    {
        vector<int> res;
        for (auto &u : level)
            res.push_back(u->val);
        return res;
    }

    vector<vector<int>> printFromTopToBottom(TreeNode* root) {
        vector<vector<int>>res;
        if (!root) return res;
        vector<TreeNode*>level;
        level.push_back(root);
        res.push_back(get_val(level));
        bool zigzag = true;
        while (true)
        {
            vector<TreeNode*> newLevel;
            for (auto &u : level)
            {
                if (u->left) newLevel.push_back(u->left);
                if (u->right) newLevel.push_back(u->right);
            }
            if (newLevel.size())
            {
                vector<int>temp = get_val(newLevel);
                if (zigzag)
                    reverse(temp.begin(), temp.end());
                res.push_back(temp);
                level = newLevel;
            }
            else break;
            zigzag = !zigzag;
        }
        return res;
    }
};

34. 二叉搜索树的后序遍历序列

原题链接
在这里插入图片描述

考点:根据二叉搜索树的后序遍历的特点

由于是后序遍历,所以最后一个结点就是根节点,又因为是二叉搜索树,所以从第一个结点开始所有比它小的结点就是它的左子树,其他就是它的右子树。如果右子树有点不大于根节点的话就说明不是一棵二叉搜索树,返回false。最后递归处理左右子树。

class Solution {
public:
    vector<int> seq;//设成全局变量方便操作

    bool verifySequenceOfBST(vector<int> sequence) {
        seq = sequence;
        return dfs(0, seq.size() - 1);
    }

    bool dfs(int l, int r)
    {
        //如果区间内啥也没有就说明把所有的结点都判断完了,却没有一个是有问题的,所以返回true
        if (l >= r)
            return true;
        //取出根节点
        int root = seq[r];
        //找出所有从l开始连续的比根节点小的结点
        int k = l;
        while (k < r && seq[k] < root)
            k ++;
        //这时k就是右子树后序遍历中的第一个结点
        //如果不满足二叉搜索树的性质就返回false
        for (int i = k; i < r; i ++)
            if (seq[i] < root)
                return false;
        //递归处理左右子树
        //y总的视频里的代码是错的
        //他写的是return dfs(l, k - 1) && dfs(k + 1, r);
        //这样会WA
        return dfs(l, k - 1) && dfs(k, r - 1);
    }
};

35. 二叉树中和为某一值的路径( dfs回溯 )

注意:只能是根节点到叶子节点

原题链接
在这里插入图片描述
首先补充题意:本题要求的路径是根节点到叶子节点

本题就是一个dfs回溯问题

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    
    vector<vector<int>> ans;
    
    vector<vector<int>> findPath(TreeNode* root, int sum) {
        vector<int> sup;
        dfs(root,sum,sup);
        return ans;
    }
    
    void dfs(TreeNode* root,int sum,vector<int>& sup)
    {
        if(root == NULL)
            return;
        
        sum -= root->val;
        sup.push_back(root->val);
        
        if(root->left == NULL && root->right == NULL && sum == 0)
            ans.push_back(sup);
        dfs(root->left,sum,sup);
        dfs(root->right,sum,sup);
        
        sum += root->val;
        sup.pop_back();
            
    }
    
};

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

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

相关文章

几款ai绘画二次元关键词软件分享给你

伴随着二次元文化的兴起&#xff0c;越来越多的人开始关注和喜爱这种独特的漫画风格。二次元绘画风格确实赏心悦目&#xff1a; 当然&#xff0c;绘画创作是二次元文化中不可或缺的部分&#xff0c;很多人也因此对绘画更加热爱。然而&#xff0c;想要制作二次元比较好看的绘画并…

RocketMQ5.0的Broker主从同步机制

RocketMQ5.0的Broker主从同步机制 一、主从同步工作原理 为了提高消息消费的高可用性&#xff0c;避免Broker发生单点故障引起存储在Broker上的消息无法及时消费&#xff0c; RocketMQ引入Broker主备机制&#xff0c;即&#xff1a;消息消费到达主服务器后需要将消息同步到消…

15分钟真正搞懂什么是“交叉熵损失函数”

大家好啊&#xff0c;我是董董灿。 在你刚学习神经网络的时候&#xff0c;有没有被一个名字叫做“交叉熵”的概念绕的云里雾里&#xff0c;以至于现在看到这个概念&#xff0c;依然很懵。 今天就来看一下&#xff0c;这个所谓的“交叉熵”到底是什么&#xff0c;以及它在神经…

【项目级面试题】关于前端鉴权这块,能详细的说说吗?

如果有人问你&#xff1a;”你做了这么多年的开发&#xff0c;关于前端鉴权这块&#xff0c;能详细的说说吗&#xff1f;“。你该如何作答&#xff0c;脑海中有没有一个完整的思路。 像 Token、Cookie、Session、JWT、单点登录 这些概念&#xff0c;它们的作用、应用场景、如何…

【C#】并行编程实战:使用 PLINQ(3)

PLINQ 是语言集成查询&#xff08;Language Integrate Query , LINQ&#xff09;的并行实现&#xff08;P 表示并行&#xff09;。本章将继续介绍其编程的各个方面以及与之相关的一些优缺点。 本文的主要内容为 PLINQ 中的组合并行和顺序 LINQ 查询、取消 PLINQ 查询、使用 PLI…

Azure AD混合部署,实现在本地AD同步到AAD上面

一、前期准备 1、进入 Azure云 注册一个账号 云计算服务 | Microsoft Azure 2、进入 AAD 管理后台 Microsoft Azure 3、创建一个新的租户 4、添加自定义域名&#xff0c;这里要做下验证&#xff0c;所以你要有个线上的域名 5、创建一个全局管理员 6、登陆本地AD&#xff0c;创…

第133页的gtk+编程例子——计算器应用改写网上的例子

第133页的gtk编程例子——计算器应用改写网上的例子 来源&#xff1a;《GTK的计算器》 https://blog.csdn.net/zhouzhouzf/article/details/17097999 重点在于它的设计思路是比较巧妙的&#xff0c;能够处理多种情况&#xff0c;比较容易理解&#xff0c;也感到人类的思想是非…

Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令

目录 ProcessBuilder类的介绍及使用 【前言】 【正文】 --构造方法-- --常用方法-- --使用技巧-- --调用本地Shell命令&#xff0c;实例-- 【总结】 【注意】 ProcessBuilder类的介绍及使用 【前言】 在做一个项目的时候需要用到运行时动态执行JAVA命令&#xff0c;一…

常用数据聚类算法总结记录与代码实现[K-means/层次聚类/DBSACN/高斯混合模型(GMM)/密度峰值聚类/均值漂移聚类/谱聚类等]

本文的主要目的是总结记录日常学习工作中常用到的一些数据聚类算法&#xff0c;对其原理简单总结记录&#xff0c;同时分析对应的优缺点&#xff0c;以后需要的时候可以直接翻看&#xff0c;避免每次都要查询浪费时间&#xff0c;欢迎补充。 聚类算法是一种无监督学习的方法&am…

chrales过期重装或使用途中的踩坑记录及使用方法

1、背景 我的是证书过期了&#xff0c;提示无网络。 1. 重新下载 安装(或者 不需要重新下载安装&#xff0c;用已有的就可以) 2. 重新进行配置 3. (关键)检查电脑上的 证书过期时间 4. (关键)检查手机上的证书过期时间 5. (手机配置好后&#xff0c;点开链接显示无网络&#…

Android:简单登录界面

一、前言&#xff1a;这个登陆界面我前前后后写了差不多一个星期&#xff0c;主要有密码登录、验证码登录、键盘自动隐藏、忘记密码、新建密码等功能&#xff0c;你们可以自己研究一下&#xff01; 二、上代码&#xff1a; 资源文件 1.在value包下面添加一个dimens.xml <…

对性能测试评估分析优化市场的反思

目录 前言&#xff1a; 性能市场的现状 性能测试人员的价值体现 年龄和加班 性能行业的出路 前言&#xff1a; 性能测试评估分析和优化是一个关键的环节&#xff0c;它可以帮助我们了解系统的性能瓶颈和潜在问题&#xff0c;并提出相应的优化方案。在市场竞争激烈的环境下…

Cesium 实战 - AGI_articulations 扩展:模型自定义关节动作

Cesium 实战 - AGI_articulations 扩展&#xff1a;模型自定义关节动作 简要概述两种方式实现模型组件动作模型添加关节&#xff08;articulations&#xff09;1.导入模型&#xff08;J15.glb&#xff09;2.查看模型内部组件信息&#xff08;名称&#xff09;4.将需要J15.glb复…

Docker常见命令(以备不时之需)

参考官网&#xff1a;https://docs.docker.com/engine/reference/commandline/cli/ 帮助启动类命令 启动docker&#xff1a; systemctl start docker 停止docker&#xff1a; systemctl stop docker 重启docker&#xff1a; systemctl restart docker 查看docker状态&…

架构训练营笔记系列:面向复杂度的设计

面向复杂度的设计 DDD 是可扩展架构的设计技巧&#xff0c;不是架构方法论。不关注高性能、高可靠。 架构本质&#xff1a;为了降低软件系统复杂度 怎么做架构设计 &#xff1f;思路是分析系统需求找到系统复杂的地方&#xff0c;然后设计方案。 复杂度相关有哪些&#xff1…

Unity的PostProcessing后处理使用介绍

大家好&#xff0c;我是阿赵。 上一篇文章说了Unity的PostProcessing后处理有bug并提供了解决办法&#xff0c;这里顺便介绍一下PostProcessing的用法。 一、安装 打开PackageManager&#xff0c;然后搜索Post&#xff0c;应该就能看到左边出现搜索结果&#xff0c;选择&…

一个人的面相能直接反映其个性与命运

中国传统文化&#xff0c;博大精深&#xff0c;面相学只是其中一种。 在古代&#xff0c;面相学却是一门非常实用的学科&#xff0c; 尤其是经过了一代代人的发展&#xff0c;面相学得到了完善之后&#xff0c;他的准确性往往会超过现代人的预料。相由心生&#xff0c;面相是对…

用户端App 测试方法与技术

目录&#xff1a; app测试体系app项目测试流程app结构讲解app测试设计思路app常见bug解析常用模拟器使用android开发者选项安装mumu模拟器adb命令介绍adb环境搭建与配置adb与设备交互adb安装卸载应用adb命令启动页面adb命令清缓存adb文件传输adb日志操作adb命令操作Android设备…

DRF+Vue.JS前后端分离项目实例(下) --- Vue.js 前端实现代码

本文上篇请 点击阅读 1. 需求说明 本文以学生信息查询功能为例&#xff0c;采用前后端分离架构&#xff0c;后端提供RESTFul 接口&#xff0c;前端代码用Vue.js Bottstrap实现。 1.1 本例要求提供如下查询功能&#xff1a; 列表查询、单条查询 添加学生信息 更改学生信息 删…