剑指offer刷题笔记--Num31-40

1--栈的压入、弹出序列(31)

直观思路:用两个指针 i 和 j 指向压入和弹出的 vector,终止条件是:所有元素都压入了辅助栈(i > len),且辅助栈当前的栈顶元素与弹出的元素 popped[j] 不相等;

#include <iostream>
#include <vector>
#include <stack>class Solution {
public:bool validateStackSequences(std::vector<int>& pushed, std::vector<int>& popped) {int len = pushed.size();if (len == 0) return true;int i = 0, j = 0; // i 指向 pushed 的元素,j 指向 popped 的元素while(i < len || !st.empty()){if (i >= len && st.top() != popped[j]){ // 栈顶元素不等于当前要pop的元素,且已push完所有元素return false;}if (!st.empty() && st.top() == popped[j]){ // 如果栈顶元素等于当前要pop的元素,pop出栈顶元素,j下移st.pop();j++;}else if(i < len && pushed[i] != popped[j]){ // i 指向的元素不等于 j 指向的元素,将 i 压入堆栈中st.push(pushed[i]);i++;}else if(i < len && pushed[i] == popped[j]){ // i 指向的元素等于 j 指向的元素,i,j移向下一位i++;j++;}}return true;}private:std::stack<int> st;
};int main(int argc, char *argv[]){std::vector<int> push = {2, 1, 0};std::vector<int> pop = {1, 2, 0};Solution S1;bool res = S1.validateStackSequences(push, pop);if(res) std::cout << "true" << std::endl;else std::cout << "false" << std::endl;return 0;
}

简便思路:

        模拟栈的压入顺序,依次压入 pushed 里的所有元素,用一个指针 j 指向需要弹出的元素,当符合弹出要求时就弹出对应的元素;

        当辅助栈为空时,表明需要弹出的元素都顺利弹出,返回 true;

#include <iostream>
#include <vector>
#include <stack>class Solution {
public:bool validateStackSequences(std::vector<int>& pushed, std::vector<int>& popped) {std::stack<int> st;int n = pushed.size();for (int i = 0, j = 0; i < n; i++) {st.emplace(pushed[i]); while (!st.empty() && st.top() == popped[j]) { // 符合弹出要求,直接 pop 出栈顶元素st.pop();j++;}}return st.empty(); // 所有元素都顺利pop出,返回true;}
};int main(int argc, char *argv[]){std::vector<int> push = {2, 1, 0};std::vector<int> pop = {1, 2, 0};Solution S1;bool res = S1.validateStackSequences(push, pop);if(res) std::cout << "true" << std::endl;else std::cout << "false" << std::endl;return 0;
}

2--从上到下打印二叉树(32)

主要思路:层次遍历打印二叉树结点

#include <iostream>
#include <vector>
#include <queue>struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};class Solution {
public:std::vector<int> levelOrder(TreeNode* root) {if (root == NULL) return Res;Q1.push(root);while(!Q1.empty()){temp = Q1.front();Q1.pop();Res.push_back(temp->val);if(temp->left != NULL){Q1.push(temp->left);}if(temp->right != NULL){Q1.push(temp->right);}}return Res;}private:std::queue<TreeNode *> Q1;std::vector<int> Res;TreeNode *temp;
};int main(int argc, char *argv[]){TreeNode *Node1 = new TreeNode(3);TreeNode *Node2 = new TreeNode(9);TreeNode *Node3 = new TreeNode(20);TreeNode *Node4 = new TreeNode(15);TreeNode *Node5 = new TreeNode(7);Node1->left = Node2;Node1->right = Node3;Node3->left = Node4;Node3->right = Node5;Solution s1;std::vector<int> res = s1.levelOrder(Node1);for(int item : res){std::cout << item << " ";}return 0;
}

3--从上到下打印二叉树II(32)

主要思路:

        与上题类似,借助于层次遍历,不同的是为了打印每一层的结点,需要循环当前层的结点数次,每一次当前队列的结点数实质上等于当前层的结点数,因此只需要循环队列的长度次,并记录对应的结点值即可;

#include <iostream>
#include <vector>
#include <queue>struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};class Solution {
public:std::vector<std::vector<int>> levelOrder(TreeNode* root) {if(root == NULL) return Res;Q1.push(root);while(!Q1.empty()){int num = Q1.size(); // 当前层的结点数for(int i = 0; i < num; i++){temp_node = Q1.front();Q1.pop();temp.push_back(temp_node->val);if(temp_node->left != NULL) Q1.push(temp_node->left); if(temp_node->right != NULL) Q1.push(temp_node->right);}    Res.push_back(temp);temp.clear();}return Res;}
private:std::vector<std::vector<int>> Res;std::queue<TreeNode *> Q1;std::vector<int> temp;TreeNode * temp_node;
};int main(int argc, char *argv[]){TreeNode *Node1 = new TreeNode(3);TreeNode *Node2 = new TreeNode(9);TreeNode *Node3 = new TreeNode(20);TreeNode *Node4 = new TreeNode(15);TreeNode *Node5 = new TreeNode(7);Node1->left = Node2;Node1->right = Node3;Node3->left = Node4;Node3->right = Node5;Solution s1;std::vector<std::vector<int>> res = s1.levelOrder(Node1);for(int i = 0; i < res.size(); i++){for(int item : res[i]){std::cout << item << " ";}std::cout << std::endl;}return 0;
}

4--从上到下打印二叉树III(32)

主要思路:

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨境干货|Etsy安全入驻开店攻略

2023了&#xff0c;跨境电商现在上车还来得及吗&#xff1f;当然&#xff01;Etsy是一个低成本低竞争高回报的平台&#xff0c;相较于其他电商平台&#xff0c;他的佣金非常低&#xff0c;利润率更高&#xff0c;非常合适跨境小白入局。 但由于目前Etsy关闭了中国大陆卖家的注…

[SpringBoot]Spring Security框架

目录 关于Spring Security框架 Spring Security框架的依赖项 Spring Security框架的典型特征 关于Spring Security的配置 关于默认的登录页 关于请求的授权访问&#xff08;访问控制&#xff09; 使用自定义的账号登录 使用数据库中的账号登录 关于密码编码器 使用BCry…

vue3 异步组件

vue3中使用异步组件 vue3中使用异步组件可以解决两个问题&#xff1a; 1.提升性能&#xff08;类似于懒加载&#xff09; 2.分包 下载插件 npm i vueuse/core -S 1.提升性能&#xff08;懒加载&#xff09; 父组件 <template><div><h1>异步组件</h1&g…

Scala集合与Java集合的互转函数asScala与asJava

只有引入隐式转换类 JavaConverters&#xff0c;才能使用Scala集合与Java集合之间的转换函数。 为方便理解&#xff0c;看下面的例子&#xff1a; import scala.collection.JavaConverters._ val javaList java.util.Arrays.asList("hi", "bye") val sca…

RabbitMQ - 死信队列,延时队列

Time-To-Live and Expiration — RabbitMQ 一、死信队列 Dead Letter Exchanges — RabbitMQ 死信队列&#xff1a; DLX 全称&#xff08;Dead-Letter-Exchange&#xff09;,称之为死信交换器&#xff0c;当消息变成一个死信之后&#xff0c;如果这个消息所在的队列存在x-d…

Hive(15):Table(表)DDL操作

1 Describe table Hive中的DESCRIBE table语句用于显示Hive中表的元数据信息 describe formatted [db_name.]table_name; describe extended [db_name.]table_name; 如果指定了EXTENDED关键字,则它将以Thrift序列化形式显示表的所有元数据。如果指定了FORMATTED关键字,则它…

赛效:怎么在线给Word文档加图片水印

1&#xff1a;在电脑网页上打开云组件&#xff0c;点击“Word转换”菜单里的“Word加水印&#xff08;图片&#xff09;”。 2&#xff1a;点击选择文件添加Word文档。 3&#xff1a;点击“选择水印图片”上传做水印的图片。 4&#xff1a;水印图片添加成功后可以选择水印角度&…

C#核心知识回顾——1.结构体、构造函数、GC、成员属性、索引器

1.结构体&#xff1a; 在 C# 中&#xff0c;结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。例如我定义了一个结构体&#xff0c;它有两个变量&#xff0c;创建一个这个类型的结构体&#xff0c;通过一个变量名调用多个变量&#xff0c;这些变量可…

机器学习复习7

机器学习复习7 1 - 根据下图中绘制的决策树&#xff0c;如果一个动物的耳朵是软的&#xff0c;脸型是圆的&#xff0c;并且有胡须&#xff0c;那么这个模型会预测它是猫还是不是猫&#xff1f; A. 不是猫 B. 是猫 **答案&#xff1a;B ** 2 - 以一棵决策树学习来对垃圾邮件和非…

uniapp radio如何实现取消选中

uniapp 内置radio组件明确表示&#xff0c;不能取消选中&#xff0c;那如果要实现取消选中呢&#xff1f; 只要在外层加上label或者其他标签包裹&#xff0c;或者直接加入click事件然后加入事件控制radio的值改变即可 <label class"radio" click"changeAll&…

vue 连载软件大陆 vue之新手村,vue创建运行指导(如:vue脚手架,创建启动项目,配置等)

第一章 ’vue功法启动‘ 宇宙之间&#xff0c;开天辟地&#xff0c;从无到有&#xff0c;有一颗蔚蓝色的星球&#xff0c;名为软件大陆&#xff0c;如今大陆上有着众多老牌家族势力的诞生,如&#xff1a;c家族、c家族、java家族、.net家族、等&#xff0c; 而我们今天要说的是…

机器人学科建设沙盘套件!mechArm机械臂智慧农业3D分拣套装详解

作为最热门的技术领域&#xff0c;机器人技术正在彻底改变产业&#xff0c;并推动全球的创新。为了满足这个快速发展的领域对技术人才日益增长的需求&#xff0c;高校开发了一个开创性的机器人教育解决方案。这个创新的解决方案将自动化水果采摘机的模拟与水果分拣和运送的自动…