【算法题】牛客研发最爱考[41 - 50]_public int[] getminstack (int[][] op) { // write c-程序员宅基地

刷题链接

输出二叉树的右视图(递归,bfs)

前置知识:1.重建二叉树 2. 二叉树的层序遍历 3.结构体

class Solution {
    
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 求二叉树的右视图
     * @param xianxu int整型vector 先序遍历
     * @param zhongxu int整型vector 中序遍历
     * @return int整型vector
     */
    struct TreeNode{
    
        int val;
        TreeNode *left,*right;
        TreeNode(int v) : val(v) {
    }
    };
    
    map<int,int> pos;
    vector<int> res;
    
    vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
    
        // write code here
        
        int n = zhongxu.size();
        for(int i = 0;i < n;i ++ ) pos[zhongxu[i]] = i;
        
        auto root = dfs(xianxu,zhongxu,0, n - 1,0, n - 1);
        
        bfs(root);
        return res;
    }
    
    TreeNode *dfs(vector<int>& pre, vector<int>& inorder,int pl,int pr,int il,int ir)
    {
    
        if(pl > pr) return NULL;
        int val = pre[pl];
        int k = pos[val];
        int len = k - il;
        TreeNode *root = new TreeNode(val);
        root->left = dfs(pre,inorder,pl + 1,pl + len,il,k - 1);
        root->right = dfs(pre,inorder,pl + len + 1,pr,k + 1,ir);
        return root;
    }
    
    void bfs(TreeNode* root)
    {
    
        queue<TreeNode*> q;
        q.push(root);
        while(q.size())
        {
    
            int n = q.size();
            vector<int> cur;
            while(n --)
            {
    
                auto t = q.front();
                q.pop();
                cur.push_back(t->val);
                if(t->left) q.push(t->left);
                if(t->right) q.push(t->right);
                
            }
            res.push_back(cur.back());
        }
    }
};

设计getMin功能的栈(单调栈)

class Solution {
    
public:
    /**
     * return a array which include all ans for op3
     * @param op int整型vector<vector<>> operator
     * @return int整型vector
     */
    stack<int> stk,minstk; // 单调栈作最小栈
    vector<int> getMinStack(vector<vector<int> >& op) {
    
        // write code here
        vector<int> res;
        for(auto &c : op)
        {
    
            int a = c[0];
            if(a == 1)
            {
    
                int b = c[1];
                stk.push(b);
                if(minstk.empty() || b <= minstk.top()) minstk.push(b);
            }
            else if(a == 2)
            {
    
                if(minstk.top() == stk.top()) minstk.pop();
                stk.pop();
            }
            else if(a == 3)
            {
    
                res.push_back(minstk.top());
            }
        }
        return res;
    }
};

表达式求值(栈,递归)

这道题的精髓在:括号,递归处理。
题解

class Solution {
    
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    int solve(string s) {
    
        // write code here
        stack<int> nums;
        char sign = '+';
        int num = 0;
        s += '+' ; // 为了边界处理
        for(int i = 0;i < s.size();i ++ )
        {
    
            if(isdigit(s[i])){
    
                // 溢出处理
                num *= 10;
                num = num - '0' + s[i];
            }
            
            // 括号,递归处理
            if(s[i] == '(')
            {
    
                int j = i + 1;
                int count = 1;
                while(count){
    
                    if(s[j] == ')') count --;
                    else if(s[j] == '(') count ++;
                    j ++ ;
                }
                num = solve(s.substr(i + 1,j - i - 1));
                i = j - 1;
            }
            
            if(s[i] == '+' || s[i] == '-' || s[i] == '*')
            {
    
                if(sign == '+')
                {
    
                    nums.push(num);
                }
                else if(sign == '-')
                {
    
                    nums.push(-num);
                }
                else if(sign == '*')
                {
    
                    int b = nums.top();
                    nums.pop();
                    nums.push(num * b);
                }
                num = 0;
                sign = s[i];
            }
            
        }
        
        int res = 0;
        while(nums.size()) {
    
            res += nums.top();
            nums.pop();
        }
        return res;
    }
};

平衡二叉树(递归)

前置知识:递归求二叉树的高度

class Solution {
    
public:
    bool ans;
    bool IsBalanced_Solution(TreeNode* pRoot) {
    
        ans = true;
        dfs(pRoot);
        return ans;
    }
    
    int dfs(TreeNode *root)
    {
    
        if(!root) return 0;
        
        int left = dfs(root->left);
        int right = dfs(root->right);
        
        if(abs(left - right) > 1) ans = false;
        return max(left,right) + 1;
    }
};

岛屿数量(flood fill算法)

dfs求连通块

class Solution {
    
public:
    /**
     * 判断岛屿数量
     * @param grid char字符型vector<vector<>> 
     * @return int整型
     */
    vector<vector<bool>> st;
    int dx[4] = {
    -1,0,1,0}, dy[4] = {
    0,1,0,-1};
    int n,m;
    vector<vector<char> > g;
    int solve(vector<vector<char> >& grid) {
    
        // write code here
        g = grid;
        if(grid.empty() || grid[0].empty()) return 0;
        
        n = grid.size(), m = grid[0].size();
        st = vector<vector<bool>>(n,vector<bool>(m));
        int cnt = 0;
        for(int i = 0;i < n;i ++ )
           for(int j = 0;j < m;j ++ )
               if(g[i][j] == '1' && !st[i][j])
               {
    
                   dfs(i,j);
                   cnt ++;
               }
         return cnt;
    }
    
    void dfs(int x,int y)
    {
    
        st[x][y] = true;
        for(int i = 0;i < 4;i ++ )
        {
    
            int a = x + dx[i], b= y + dy[i];
            if(a < 0 || a >= n || b < 0 || b >= m || st[a][b] || g[a][b] == '0') continue;
            dfs(a,b);
        }
    }
};

判断回文(双指针)

class Solution {
    
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param str string字符串 待判断的字符串
     * @return bool布尔型
     */
    bool judge(string str) {
    
        // write code here
        for(int i = 0, j = str.size() - 1;i < j;i ++ , j -- )
            if(str[i] != str[j]) return false;
        return true;
    }
};

二叉树的最大深度(递归)

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */

class Solution {
    
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    int maxDepth(TreeNode* root) {
    
        // write code here
        return dfs(root);
    }
    
    int dfs(TreeNode *root)
    {
    
        if(!root) return 0;
        
        int left = dfs(root->left);
        int right = dfs(root->right);
        
        return max(left,right) + 1;
    }
};

进制转换(短除法)

进制转换

class Solution {
    
public:
    /**
     * 进制转换
     * @param M int整型 给定整数
     * @param N int整型 转换到的进制
     * @return string字符串
     */
    char get(int x)
    {
    
        if(x <= 9) return x + '0';
        else return x - 10 + 'A';
    }
    
    string solve(int M, int N) {
    
        // write code here
        if(M == 0) return "0"; // 1.特判0
        
        string res;
        bool f = 0;  // 2.负数处理
        if(M < 0) f = 1,M = -M;
        while(M){
    
            res += get(M % N);
            M /= N;
        }
        if(f) res += "-";
        reverse(res.begin(),res.end());
        
        return res;
    }
};

买卖股票一次(贪心)

class Solution {
    
public:
    /**
     * 
     * @param prices int整型vector 
     * @return int整型
     */
    int maxProfit(vector<int>& prices) {
    
        // write code here
        int n = prices.size();
        int minlow = 1e9;
        int res = 0;
        for(int i = 0;i < n;i ++ )
        {
    
            res = max(res,prices[i] - minlow);
            minlow = min(minlow,prices[i]);
        }
        return res;
    }
};

只出现一次的数字III(异或,位运算)

题解

class Solution {
    
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
    
        int bit_mask = 0;
        for(auto c : data) bit_mask ^= c;
        
        int d = bit_mask & (-bit_mask);
        
        int v1 = 0;
        for(auto c : data)
            if(c & d) 
                v1 ^= c;
        *num1 = v1, *num2 = v1 ^ bit_mask; // 通过引用来返回值
    }
};
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43154149/article/details/114049775

智能推荐

时间序列预测 | Matlab基于麻雀算法(SSA)优化门控循环单元(SSA-GRU)的时间序列预测-程序员宅基地

文章浏览阅读27次。时间序列预测 | Matlab基于麻雀算法(SSA)优化门控循环单元(SSA-GRU)的时间序列预测

CWDM、DWDM、FWDM、MWDM、LWDM概述讲解_tdm cwdm lwdm mwdm-程序员宅基地

文章浏览阅读274次。与CWDM类似,它也是一种基于波分复用技术的光纤传输技术,但它的通道数更多、信道间隔更小,可以实现更高的传输容量。它是一种基于波分复用技术的光纤传输技术,可将来自不同来源的多个光信号,按照不同的波长,通过同一根光纤进行传输。顾名思义,它是一种基于滤波器的波分复用技术,通过精细的滤波器设计,将不同波长的光信号分离出来进行传输。它与CWDM和DWDM类似,但波长范围更偏向于长波长光信号的传输,适用于某些特定的光纤传输应用场景。_tdm cwdm lwdm mwdm

线上打包和本地打包的区别_vue项目 linux打包和本地打包有区别嘛-程序员宅基地

文章浏览阅读3.3k次。本地打的包对依赖的jar包是从本地仓库中取,所以如果多模块项目中自己写的被依赖的模块要保证私服中始终是最新的代码,及时安装到本地。线上使用jenkins打的包是从私服上拉代码,所以要保证本地修改在打包前一定要提交到私服上。jenkins打的包和本地不一样是,考虑以下方面,看看服务器时间是否不一样,或者在jenkins的代码拉取是加上@head。..._vue项目 linux打包和本地打包有区别嘛

EOS的BFT与DPOS-程序员宅基地

文章浏览阅读80次。EOS的共识机制是DPoS(Delegated Proof of Stake),而不是BFT。EOS采用DPoS的设计,它侧重于代币持有者的投票,代表人轮流生成区块,而不同于传统的BFT机制。虽然EOS的DPoS也旨在确保网络的安全性和一致性,但它的工作方式和设计思路与BFT不同。BFT共识机制是一种用于分布式系统的共识算法,可以确保在存在故障或恶意行为的情况下系统仍能达成一致的决策。总之,EOS的共识机制是DPoS,而不是传统的BFT,这两者在设计和工作原理上有很大的不同。

[力扣c++实现] 221. 最大正方形_最大正方形c++-程序员宅基地

文章浏览阅读527次。在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。_最大正方形c++

【Spring Boot|MyBatis】解决MyBatis报错:无效的绑定语句_mybatis连接多数据源报错无效绑定-程序员宅基地

文章浏览阅读4.8k次,点赞12次,收藏13次。【Spring Boot】解决报错MyBatis 无效的绑定语句错误的原因是Maven未将Mapper的xml复制到类路径下,导致MyBatis找不到Mapper接口对应的xml文件。有两种方法第一种把Mapper接口与Mapper.xml放在同一个包下第二种在 pom.xml 中添添加如下配置<dependencies> ...</dependencies><build> <resources> <r_mybatis连接多数据源报错无效绑定

随便推点

c语言和c++的相互调用_c调用c++-程序员宅基地

文章浏览阅读1.9w次,点赞13次,收藏102次。在实际项目开发中,c和c++代码的相互调用是常见的,c++能够兼容c语言的编译方式,但是c++编译器g++默认会以c++的方式编译程序,而c程序编译器gcc会默认以c的方式编译它,所以c和c++的相互调用存在一定的技巧。1.c方式编译和c++方式编译一般.cpp文件是采用g++去编译,.c文件是采用gcc编译,然而这不是绝对的。 (1)gcc和g++都可以编译.c文件,也都可以编译.cpp文件。g_c调用c++

西门子精智HMI-TP1200发邮件功能_精智触摸屏发送邮件怎么发送-程序员宅基地

文章浏览阅读3.4k次。西门子人机界面TP1200,基于SMTP功能,实现自动发送邮件功能_精智触摸屏发送邮件怎么发送

介绍一个文本提取库 —— Goose-程序员宅基地

文章浏览阅读446次。goose3主要用于新闻、文章的主要信息提取。GOOSE将尝试提取以下信息:文章主文文章图片文章中的YouTube / Vimeo视频描述标记标签使用pip安装pipinstallg..._goose 文本解析库

读取PNG颜色索引数据_png_get_color_type-程序员宅基地

文章浏览阅读5.2k次,点赞2次,收藏9次。在某些应用中,可能需要PNG图片每个像素颜色索引值。如在目标检测中,VOC2012数据库中对每个目标类进行了分割标注,不同类别分别采用不同的颜色索引值。如0 表示背景, 1表示飞机等。opencv中的imread函数可以直接读出png RGB颜色信息,但是不能读出每个像素的颜色索引值。所以,本文给出了一个读取png图片每个像素颜色索引的函数。该函数依赖libpng库,并且和opencv相结合,利用_png_get_color_type

定积分的计算(换元法)_定积分换元-程序员宅基地

文章浏览阅读2.6k次。### 定积分换元法设$f$在$[a,b]$上连续,$\varphi$在$[\alpha,\beta]$上可导且导数连续,$x=\varphi(t)$在$[\alpha,\beta]$上的值域包含于$[a,b]$,且$\varphi(\alpha)=a,\varphi(\beta)=b$,则_定积分换元

海明码校验和纠错原理_hanmming code (64 8) sec_ded-程序员宅基地

文章浏览阅读4.3k次,点赞8次,收藏38次。 海明码(Hamming Code)是一个可以有多个校验位,具有检测并纠正一位错误代码的纠错码,所以它也仅用于信道特性比较好的环境中,如以太局域网中,因为如果信道特性不好的情况下,出现的错误通常不是一位。 海明码的检错、纠错基本思想是将有效信息按某种规律分成若干组,每组安排一个校验位进行奇偶性测试,然后产生多位检测信息,并从中得出具体的出错位置,最后通过对错误位取反(也是原来是1就变..._hanmming code (64 8) sec_ded