【算法题】牛客研发最爱考[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

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文