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

news2024/10/7 16:22:23

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.coloradmin.cn/o/716151.html

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

相关文章

Maven Snapshot 更新策略配置方法

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 在微服务的项目开发中&#xff0c;特别是更新比较频繁的项目&#xff0c;经常会遇到一些项目依赖的问题&#xff0c;依赖的一个项目经常更新&#xff0c;所以我下拉更新项目时候经常出现代码不一致&a…

Ansys Zemax | 使用软件建立立方体卫星系统(一)

在航空航天工业领域中&#xff0c;立方体卫星&#xff08;CubeSats&#xff09;已然是一种低成本、易制造的航天光学系统的解决方案。通过制造一组更小、更实惠的系统&#xff0c;使得为航天产品开发生产线方法成为可能。 立方体卫星光学系统的制造商们需要一个准确并可靠的方法…

基于微信小程序学校部门年终绩效考核自动评分系统(源码+文档+数据库+PPT)

基于微信小程序的部门年终绩效考核系统&#xff0c;为加强学校运营队伍建设提高学校管理力&#xff0c;合理评价教师及部门年度工作计划完成情况&#xff0c;促进整体绩效改进&#xff0c;鼓励管理团队注重对下属进行帮助、提升&#xff0c;促进团队扩张和发展&#xff0c;特制…

【花雕】全国青少年机器人技术一级考试备考实操搭建手册10

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

idea篇2:常用插件

1、汉化插件 下载完成后点击Restart IDE 如果你这边插件搜不出来&#xff0c;还可以去官网插件地址下载 打开 https://plugins.jetbrains.com/ 然后点击Instatll To IDE 弹出Success的时候我们切换回IDEA,然后点击ok 如果你这种方式还是无法成功 那么还可以点击插件商城的Ve…

半年面试数百场,我总结出了这份 10w 字 Java 面试复盘笔记

Java 面试 Java 作为编程语言中的 NO.1,选择入行做 IT 做编程开发的人&#xff0c;基本都把它作为首选语言,进大厂拿高薪也是大多数小伙伴们的梦想。以前 Java 岗位人才的空缺&#xff0c;而需求量又大&#xff0c;所以这种人才供不应求的现状&#xff0c;就是 Java 工程师的薪…

【javascript】导航栏

要实现这样的效果主要有两点。第一&#xff0c;当鼠标经过主导航栏里面的内容就会被放大&#xff0c;鼠标离开后就会恢复原来的样子&#xff1b;第二&#xff0c;当鼠标经过主导航时对应的副导航的内容就会呈现。 <!DOCTYPE html> <html lang"en"> <…

Flink写入数据到ClickHouse

文章目录 1.ClickHouse建表1.ClickHouse依赖2.Bean实体类3.ClickHouse业务写入逻辑4.测试写入类5.发送数据 1.ClickHouse建表 ClickHouse中建表 CREATE TABLE default.test_write (id UInt16,name String,age UInt16 ) ENGINE TinyLog();1.ClickHouse依赖 Flink开发相关…

爬虫入门指南(7):使用Selenium和BeautifulSoup爬取豆瓣电影Top250实例讲解【爬虫小白必看】

文章目录 介绍技术要点SeleniumBeautifulSoupOpenpyxl 实现步骤&#xff1a;导入所需库设置网页URL和驱动路径创建 ChromeDriver 服务配置 ChromeDriver创建 Excel 文件爬取数据关闭浏览器保存 Excel 文件 完整代码导出的excel 效果图未完待续.... 介绍 在本篇博客中&#xff…

Day976.如何安全、快速地接入OAuth 2.0? -OAuth 2.0

如何安全、快速地接入OAuth 2.0&#xff1f; Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于如何安全、快速地接入OAuth 2.0&#xff1f;的内容。 授权服务将 OAuth 2.0 的复杂性都揽在了自己身上&#xff0c;这也是授权服务为什么是 OAuth 2.0 体系的核心的原因之…

企业为什么纷纷推崇数字化管理?

企业提倡或推崇数字化管理&#xff0c;通常是因为几个原因&#xff1a; 效率和生产力&#xff1a;数字管理系统简化流程并自动执行重复任务&#xff0c;从而提高效率和生产力。数字工具可以更快地输入、检索和分析数据&#xff0c;减少人工工作和人为错误。这种效率使企业能够在…

STM32速成笔记—Flash闪存

文章目录 一、Flash简介二、STM32F1的Flash三、Flash操作步骤四、程序设计4.1 读取数据4.2 写入数据&#xff08;不检查&#xff09;4.3 写入数据&#xff08;检查&#xff09; 五、注意事项 一、Flash简介 快闪存储器&#xff08;flash memory&#xff09;&#xff0c;是一种…

物理与IP环境的重要性:打造稳定可靠的亚马逊测评环境

在亚马逊平台上进行测评补单、撸卡和撸货等活动&#xff0c;首要问题是确保环境的安全性和稳定性。一个稳定的环境是进行测评和撸卡的基础&#xff0c;如果无法解决安全性问题&#xff0c;那么从事这些项目就不值得。在环境技术研发领域已经有六七年的经验&#xff0c;在早期测…

红利期已过?2023跨境电商还吃香吗?亚马逊还能做吗?

2022年&#xff0c;由于疫情反复和外部因素的影响&#xff0c;跨境电商的情况并不乐观。但这并不意味着跨境电商已经走到了绝境。随着贸易全球化的深入发展&#xff0c;平台规则不断完善&#xff0c;国家相继出台最新的扶持政策&#xff0c;为跨境电商企业带来了更多的发展机遇…

Spring Boot 中的 Zookeeper 分布式锁

Spring Boot 中的 Zookeeper 分布式锁 分布式锁是分布式系统中常用的一个同步工具&#xff0c;它可以在多个进程之间协调访问共享资源&#xff0c;避免数据不一致或重复处理。在分布式环境中&#xff0c;由于网络通信的延迟和节点故障等原因&#xff0c;传统的锁机制无法满足需…

MES与ERP系统的生产计划管理到底有什么不同?

MES 的生产计划管理与 ERP 的生产计划管理到底有什么不同&#xff1f; 生产计划管理是企业发展的重要一环&#xff0c;对于提升企业生产效率&#xff0c;提高客户满意度&#xff0c;降低成本&#xff0c;提高客户满意度等方面都有重要意义。 我们首先来看MES和ERP生产计划管理…

Cisco Catalyst 9000 Series Switches, IOS-XE Release Dublin-17.11.1 ED

Cisco Catalyst 9000 Series Switches, IOS-XE Release Dublin-17.11.1 ED Cisco Catalyst 9000 交换产品系列 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-catalyst-9000/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;…

Vox-E: Text-guided Voxel Editing of 3D Objects(3D目标的文本引导体素编辑)

Vox-E: Text-guided Voxel Editing of 3D Objects &#xff08;3D目标的文本引导体素编辑&#xff09; Paper&#xff1a;https://readpaper.com/paper/1705264952657440000 Code&#xff1a;http://vox-e.github.io/ 原文链接&#xff1a;Vox-E: 3D目标的文本引导体素编辑 &…

如何写出高效的软件测试用例,测试人都用得到

要编写出高效的测试用例&#xff0c;需要搞清楚什么是测试用例&#xff0c;以及如何编写出高效的测试用例&#xff1f;接下来将从以下几个部分来进行展开 1、什么是测试用例 2、如何编写测试用例 一、什么是测试用例 测试用例 &#xff1a;为了特定目的而设计的由一组测试输…

【el-tree大量数据卡顿解决】el-tree利用懒加载解决大数据量卡顿问题,el-tree懒加载回显方法

描述 问题是这样&#xff1a;我的项目中&#xff0c;有一个角色管理的页面。以前的老代码&#xff0c;直接用el-tree渲染的树形结构&#xff0c;勾选设置对应的权限。其他的部门倒是还好&#xff0c;但是涉及到老板的部门设置的时候&#xff0c;由于我们这边的权限太多&#x…