TikTok真题第10天 | 1541.平衡括号字符串的最少插入次数、1209.删除字符串中所有相邻重复项、1530.好叶子结点对的数量

1541.平衡括号字符串的最少插入次数

题目链接:1541.minimum-insertions-to-balance-a-parentheses-string

解法:

官方题解这次写得非常好。参考题解:左右括号匹配

这道题一眼看过去,就是用栈解决。不过可以使用计数代替栈,也就是记录左括号的数量(相当于栈中弹入左括号)。

如果当前为右括号,而左括号的数量为空,那么需要插入一个左括号(result++);如果当前为右括号,且左括号不为空,那么首先左括号数量减1(相当于栈中弹出左括号),表示消消乐,然后如果下一个还是右括号,就继续往下走 (idx+=2),如果下一个不是右括号,那么需要插入右括号 (result++)。

遍历结束后,如果左括号的数量大于1,说明还需要插入右括号来匹配。插入的数量为 leftCount * 2 (result += leftCount * 2)。

下面给出了计数法和栈两种写法,可以对比一下,思路完全一致。

边界条件:无

时间复杂度:O(n)

空间复杂度:O(1)

class Solution {
public:int minInsertions(string s) {int inserts = 0, leftCount = 0, length = s.size();int idx = 0;while (idx < length) {char c = s[idx];if (c=='(') {leftCount++;idx++;} else {// 如果当前为右括号,那么必须先消除左括号if (leftCount>0) {leftCount--;} else {// 没有左括号则添加左括号inserts++;}// 如果当前为右括号,那么下一个必须也是右括号if (idx < length-1 && s[idx+1]==')') {idx+=2;} else {inserts++;idx++;}}}inserts += 2 * leftCount;return inserts;}
};
// 栈
class Solution {
public:int minInsertions(string s) {int inserts = 0, length = s.size();stack<char> leftStack;int idx = 0;while (idx < length) {char c = s[idx];if (c=='(') {leftStack.push(c);idx++;} else {if (!leftStack.empty()) {leftStack.pop();} else {inserts++;}if (idx+1 < length && s[idx+1]==')') {idx+=2;} else {inserts++;idx++;}}}inserts += 2 * leftStack.size();return inserts;}
};

1209.删除字符串中所有相邻重复项

题目链接:1209.remove-all-adjacent-duplicates-in-string-ii

解法:

使用栈来处理。

将元素依次入栈并统计元素数量,所以栈中同时放入元素和数量的pair对。每次入栈判断是否和栈顶元素相同:

(1)如果栈为空,或者元素与栈顶元素不同,则入栈并将元素个数记为1

(2)如果与栈顶元素相同,且加入当前元素后仍然没有满k,那么栈顶元素加1

(3)如果与栈顶元素相同,且加入当前元素后满k了,那么将栈顶元素出栈。

(4)遍历完字符串之后,将栈中剩余元素拼接即为答案。

由于栈中的元素是后进先出,那么最后拼接答案时,取出来的元素的顺序和原字符串的顺序是反的,比如abcd,在stack中是[a,b,c,d],那么stack.top() 取出来是[d, c, b, a],所以取出元素进行拼接后,需要翻转一下结果。如果不想翻转,那么可以用vector来替代stack,效率还更高。

参考题解:栈

边界条件:无

时间复杂度:O(n)

空间复杂度:O(n)

class Solution {
public:string removeDuplicates(string s, int k) {stack<pair<char, int>> charStack;for (char c: s) {if (charStack.empty() || charStack.top().first!=c) {charStack.push({c, 1});} else if (charStack.top().second+1<k) {charStack.top().second++;} else {charStack.pop();}}string res;while (!charStack.empty()) {pair<char, int> p = charStack.top();// 注意这个语法,第一个参数是个数res.append(p.second, p.first);charStack.pop();}// 注意要翻转结果reverse(res.begin(), res.end());return res;}
};
// 用vector替代stack
class Solution {
public:string removeDuplicates(string s, int k) {vector<pair<char, int>> charStack;for (char c: s) {if (charStack.empty() || charStack.back().first!=c) {charStack.push_back({c, 1});} else if (charStack.back().second+1<k) {charStack.back().second++;} else {charStack.pop_back();}}string res;for(const auto& p: charStack) {// 注意这个语法,第一个参数是个数res.append(p.second, p.first);}return res;}
};

1530.好叶子结点对的数量

题目链接:1530.https://leetcode.com/problems/number-of-good-leaf-nodes-pairs/

解法:

这个题解比较清晰:递归

遍历这棵树,对于每一个遍历到的节点node,计算node左右子树中叶子节点到node的距离,把这个距离记录为两个向量。

而这个距离又可以分解为node的左孩子到左子树中叶子结点的距离加1,右孩子到右子树中叶子节点的距离加1。

左右子树中的叶子节点对进行组合,也就是两个向量中的元素两两相加,如果它们的距离之和小于等于distance,则结果加1。

对于当前节点的上层节点,左右子树其实是位于上层节点的左子树或者右子树,所以需要合并当前节点node的所有叶子节点距离,传递给上层节点。

边界条件:root为1个元素

时间复杂度:O(N* distnce^2),每个节点都需要遍历,每个节点都有个双重for循环判断左右叶子结点的距离之和是否小于等于distance,

空间复杂度:O(H),H为树的高度。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int countPairs(TreeNode* root, int distance) {int res = 0;dfs(root, distance, res);return res;}// 注意 res 的类型为 int&,而不是int,因为是可变的vector<int> dfs(TreeNode* root, int distance,int& res) {// 返回值为当前节点到叶子节点的距离if (root == nullptr) return {};if (root->left == nullptr && root->right == nullptr) return {0};vector<int> left = dfs(root->left, distance, res);vector<int> right = dfs(root->right, distance, res);// 当前节点到左子树叶子结点的距离,为左孩子到左子树叶子节点的距离加1for (int i=0; i<left.size(); i++) {left[i]++;}for (int i=0; i<right.size(); i++) {right[i]++;}for (int l: left) {for (int r: right) {if (l+r <= distance) res++;}}// 合并为一个vector,作为当前节点的父节点的左叶子节点或者右叶子节点的距离集合// 由于c++中创建新合并的向量比较麻烦,所以直接把right合并到left中left.insert(left.end(), right.begin(), right.end());// 向上传递给父节点return left;}
};

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

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

相关文章

私有部署ELK,搭建自己的日志中心(三)-- Logstash的安装与使用

一、部署ELK 上文把采集端filebeat如何使用介绍完&#xff0c;现在随着数据的链路&#xff0c;继续~~ 同样&#xff0c;使用docker-compose部署&#xff1a; version: "3" services:elasticsearch:container_name: elasticsearchimage: elastic/elasticsearch:7.9…

git基础概念和常用命令(日常开发收藏备用)

目录 ### 常用命令 ### 远程仓库与克隆 ### 分支管理 ### 子模块&#xff08;Submodule&#xff09; ### 其他高级操作 ### 交互式暂存&#xff08;Interactive Staging&#xff09; ### cherry-pick ### rebase ### reflog与reset ### 子树合并&#xff08;Subtree …

JavaScript 中的 Currying 是什么

Currying 是一种将函数转换为一系列接受单个参数的函数的技术。这意味着一个拥有多个参数的函数可以被转换成仅接受一个参数的函数序列。 在 JavaScript 中&#xff0c;Currying 可以通过使用闭包和函数返回来实现。下面是一个简单的例子&#xff1a; function add(a) {retur…

【LearnOpenGL基础入门——5】着色器

目录 一.简介 二.GLSL 三.数据类型 四.输入与输出 五.Uniform 六.更多属性 一.简介 着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说&#xff0c;着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立…

【基础】【Python网络爬虫】【5.数据解析】bs4、Xpath、Parsel模块、正则表达式(附大量案例代码)(建议收藏)

Python网络爬虫基础 数据解析1. 为何数据解析2. 常见的数据类型结构化数据半结构化数据非结构化数据 3. 爬虫项目实现步骤 数据解析模块1. Bs4环境安装bs4解析流程案例 - bs4碧血剑文本爬取 2. Xpath环境安装xpath解析的编码流程xpath表达式如何理解&#xff1f;案例 - 简历模板…

C# Word Excel Could not load file or assembly ‘office, Version=15

C# Word Excel Could not load file or assembly ‘office, Version15 vs2022创建的windows窗体应用程序非.netframework调用Microsoft.Office.Interop.Word;创建word文档时运行时出现未能加载文件或程序集“Microsoft.Office.Interop.Word, Version15.0.0.0, Cultureneutral, …

第3课 使用FFmpeg获取并播放音频流

本课对应源文件下载链接&#xff1a; https://download.csdn.net/download/XiBuQiuChong/88680079 FFmpeg作为一套庞大的音视频处理开源工具&#xff0c;其源码有太多值得研究的地方。但对于大多数初学者而言&#xff0c;如何快速利用相关的API写出自己想要的东西才是迫切需要…

Android studio 多界面的跳转和返回

一、新建一个Empty Activity项目&#xff1a; 二、修改activity_main.xml布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/a…

【Android Gradle 插件】ProductFlavor 配置 ( consumerProguardFiles 配置 | dimension 配置 )

Android Plugin DSL Reference 参考文档 : 文档主页 : Android Plugin 2.3.0 DSL Reference android 模块配置文档 : AppExtension - Android Plugin 2.3.0 DSL Reference ProductFlavor 文档 : ProductFlavor - Android Plugin 2.3.0 DSL Reference 一、ProductFlavor 配置…

10 Screen安全策略

一,关于安全策略 关于Screen安全策略的章节是为系统集成商准备的 root: # on -u qnxuser -T drm_t drm-intel ,他们负责实施和执行安全策略,以创建和维护一个可信赖的执行环境。 系统集成商使用QNX Neutrino安全策略来定义规则,并赋予Screen实用程序和应用程序procm…

【头歌实训】PySpark Streaming 入门

文章目录 第1关&#xff1a;SparkStreaming 基础 与 套接字流任务描述相关知识Spark Streaming 简介Python 与 Spark StreamingPython Spark Streaming APISpark Streaming 初体验&#xff08;套接字流&#xff09; 编程要求测试说明答案代码 第2关&#xff1a;文件流任务描述相…

什么是ajax,为什么使用ajax?

概念&#xff1a;ajax是一种现有的技术集合&#xff0c;技术内容包括&#xff1a;HTML或XHTML&#xff0c;CSS&#xff0c;JavaScript&#xff0c;DOM,XML,XSLT,以及最重要的XMLHttpRequest。用于浏览器与服务器之间使用异步传输&#xff0c;做到局部请求以实现局部刷新。 作用…

llvm后端之指令选择源码分析

llvm后端之指令选择源码分析 引言1 主要流程1.1 参数降级1.2 构建DAG1.3 类型合法化1.4 向量合法化1.5 DAG合法化1.6 DAG合并 2 目标实现2.1 TargetLowering2.2 SelectionDAGISel 引言 llvm后端指令选择主要是class SelectionDAGISel的子类实现。整个过程将llvm IR转为有向无环…

逆矩阵:解开线性代数之谜的魔法钥匙

逆矩阵&#xff1a;解开线性代数之谜的魔法钥匙 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们一同深入探讨线性代数中的重要主题——逆矩阵…

Resolume Arena(VJ音视频软件):创意无限,视听艺术的新境界

Resolume Arena是一款领先的VJ音视频软件&#xff0c;为创意人士提供了丰富的视觉效果和音频处理功能。无论是在舞台演出、音乐会还是派对活动中&#xff0c;Resolume Arena能够将音乐、视频和图像无缝地结合&#xff0c;创造出引人入胜的视听体验。 Resolume Arena具备强大的…

Nginx快速入门:nginx实现正向代理|反向代理和正向代理的区别(八)

0. 引言 我们之前讲解的一直是nginx的反向代理配置&#xff0c;关于正向代理的实现一直没有涉及&#xff0c;但在实际生产中正向代理也有非常广泛的应用场景&#xff0c;因此&#xff0c;今天我们将针对正向代理来深入学习。 1. 相关概念 1.1 什么是反向代理 所谓反向代理&…

如何利用多开软件在Windows电脑上优化游戏效果?

当今&#xff0c;许多玩家都希望在Windows电脑上通过多开软件来优化游戏效果。多开软件可以让玩家同时在一台电脑上打开多个游戏实例&#xff0c;从而提升游戏体验和效率。接下来&#xff0c;我将为大家介绍如何在Windows电脑上利用多开软件来优化游戏效果。 首先&#xff0c;…

读算法霸权笔记08_反馈

1. 关开门 1.1. clopening 1.2. 指的是一个职员工作到很晚&#xff0c;关闭门店或者咖啡店&#xff0c;几小时后又在天亮之前回来开门 1.3. 极度不规律的工作时间安排越来越常见 1.3.1. 首当其冲的是星巴克、麦当劳和沃尔玛等企业的低薪职工 1.3.2. 不规律的工作时间安排是…

云安全指的是什么,云安全产品有哪些,有什么作用

云安全是什么意思呢&#xff1f;简单来说云安全是指基于云计算商业模式应用的安全软件&#xff0c;专门保护云计算系统的网络安全学科。那么云安全和传统安全有什么区别呢&#xff1f;云安全包括在基于在线的基础架构、应用程序和平台上保持数据的私密和安全比起传统的安全要求…

Java加密算法工具类(AES、DES、MD5、RSA)

整理了有关加密算法工具类&#xff0c;结合了几个博客以及自己改良后可直接使用&#xff0c;主要介绍以下四种加密方式&#xff1a;AES、DES、MD5、RSA&#xff0c;详细介绍都在注释里面有讲。 一、AES import com.alibaba.fastjson.JSONObject; import java.nio.charset.Sta…