Leetcode刷题笔记--Hot11-20

1--有效的括号(20)

主要思路:

        利用栈,遍历字符串,遇到左括号则入栈,遇到右括号则出栈,并判断出栈元素是否与右括号匹配;

        当字符串有效时,栈为空(所有左括号都匹配出栈);当字符串无效时,则栈不为空(仍有未匹配的左括号);

#include <iostream>
#include <string>
#include <stack>class Solution {
public:bool isValid(std::string s) {int len = s.length();if (len == 0) return true;for(int i = 0; i < len; i++){if (s[i] == '(' || s[i] == '{' || s[i] == '['){st.push(s[i]);} else if(s[i] == ')' && !st.empty()){char c = st.top();st.pop();if (c != '(') return false;}else if(s[i] == '}' && !st.empty()){char c = st.top();st.pop();if (c != '{') return false;}else if(s[i] == ']' && !st.empty()){char c = st.top();st.pop();if (c != '[') return false;}elsereturn false;}return st.empty();}
private:std::stack<char> st;
};int main(int argc, char *argv[]){std::string test = "()[]{}";Solution S1;bool res = S1.isValid(test);if(res) std::cout << "true" << std::endl;else std::cout << "false" << std::endl;return 0;
}

2--合并两个有序链表(21)

主要思路:

        归并排序,分别遍历比较两个链表的结点,数值小的结点归并到新链表中;

#include <iostream>
#include <string>
#include <stack>struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}
};class Solution {
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {if(list1 == NULL && list2 == NULL) return NULL;ListNode* head = new ListNode();ListNode* l_back = head; // 指向新链表最后一个结点ListNode* l1 = list1;ListNode* l2 = list2;while(l1 != NULL && l2 != NULL){if(l1->val < l2->val){l_back->next = l1;l1 = l1->next;l_back = l_back->next;}else{l_back->next = l2;l2 = l2->next;l_back = l_back->next;}}if(l1 == NULL) l_back->next = l2;if(l2 == NULL) l_back->next = l1;return head->next;}
};int main(int argc, char *argv[]){ListNode* Node1 = new ListNode(1);ListNode* Node2 = new ListNode(2);ListNode* Node3 = new ListNode(4);Node1->next = Node2;Node2->next = Node3;ListNode* Node4 = new ListNode(1);ListNode* Node5 = new ListNode(3);ListNode* Node6 = new ListNode(4);Node4->next = Node5;Node5->next = Node6;Solution S1;ListNode* l = S1.mergeTwoLists(Node1, Node4);while(l != NULL){std::cout << l->val << " ";l = l->next;} return 0;
}

3--括号生成(22)

主要思路:视频讲解

        递归遍历第 num 个字符是属于左括号还是右括号,递归终止条件是剩下的左括号和右括号数为 0;

        有效的括号组合必须是当前剩下的右括号数必须大于剩下的左括号数;

#include <iostream>
#include <string>
#include <vector>class Solution {
public:std::vector<std::string> generateParenthesis(int n) {recur(n, n, 0);return Res;}// 还剩下 left 个和 right 个左括号和右括号,当前要填第 num 个字符void recur(int left, int right, int num){if(left == 0 && right == 0){c[num] = 0;Res.push_back(c);return;}if(left){ // 剩下的左括号不为 0c[num] = '(';recur(left - 1, right, num + 1);}if(left < right){ // 剩下的右括号必须大于剩下的左括号c[num] = ')';recur(left, right - 1, num + 1);}}
private:std::vector<std::string> Res;char c[20];
};int main(int argc, char *argv[]){int n = 3;Solution S1;std::vector<std::string> Res = S1.generateParenthesis(n);for(std::string value : Res){std::cout << value << std::endl;}return 0;
}

4--合并K个升序链表(23)

主要思路:视频讲解参考

        与归并排序两个有序链表的思想类似,可以用 k 个结点指针指向 k 个链表的结点,每次归并值最小的结点到链表中,同时结点下移;

        为了方便比较 k 个链表结点的值大小,可以用一个集合来存储和维护 k 个链表结点,其中这个集合默认以升序排列;则每次只需要取集合的头元素出来即可,并将该元素的下一个结点重新存储在 k 个链表结点中; 

#include <iostream>
#include <queue>struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}
};class Solution {
public:ListNode* mergeKLists(std::vector<ListNode*>& lists) {using Elem = std::pair<int, ListNode*>;// 定义一个堆,用于存储 k 个头结点(升序排列)std::priority_queue<Elem, std::vector<Elem>, std::greater<Elem>> Stack;// 用 k 个链表的头结点初始化堆for(ListNode* item : lists) if(item){Stack.push({item->val, item});}// 定义归并后的链表ListNode *head = nullptr;ListNode *tail = nullptr;while(!Stack.empty()){Elem tmp = Stack.top();Stack.pop();if(head == nullptr){head = tail = tmp.second; // 空链表时第一个结点作为头节点}else{tail->next = tmp.second; // 链表非空,将新结点加入到链表尾部tail = tail->next; // 更新尾指针}if(tmp.second->next != nullptr){ // 将下一个结点放到堆中,用于下一轮的比较Stack.push({tmp.second->next->val, tmp.second->next});}}return head;}};int main(int argc, char *argv[]){ListNode *Node1 = new ListNode(1);ListNode *Node2 = new ListNode(4);ListNode *Node3 = new ListNode(5);Node1->next = Node2;Node2->next = Node3;ListNode *Node4 = new ListNode(1);ListNode *Node5 = new ListNode(3);ListNode *Node6 = new ListNode(4);Node4->next = Node5;Node5->next = Node6;ListNode *Node7 = new ListNode(2);ListNode *Node8 = new ListNode(6);Node7->next = Node8;std::vector<ListNode*> Lists = {Node1, Node4, Node7};Solution S1;ListNode *NewList = S1.mergeKLists(Lists);while(NewList != nullptr){std::cout << NewList->val << " ";NewList = NewList->next;}return 0;
}

5--下一个排列(31)

主要思路:

         

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

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

相关文章

多元回归预测 | Matlab麻雀算法(SSA)优化极限梯度提升树XGBoost回归预测,SSA-XGBoost回归预测模型,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 麻雀算法(SSA)优化极限梯度提升树XGBoost回归预测,SSA-XGBoost回归预测模型,多变量输入模型,多变量输入模型,matlab代码回归预测,多

飞轮储能系统的建模与MATLAB仿真(永磁同步电机作为飞轮驱动电机)

简介 飞轮储能系统由于其高储能密度、高效率、轻污染的优点而越来越受到重视。飞轮储能系统以高速旋转的飞轮为依托&#xff0c;通过电力电子设备实现电能与动能的相互转化&#xff0c;从而在负载调峰、功率平抑、不间断电源等多领域都有很好的应用表现。 本文选用永磁同步电机…

【C++】list模拟实现

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f681; 个人主页&#xff1a;不 良 &#x1f525; 系列专栏&#xff1a;&#x1f6f8;C &#x1f6f9;Linux &#x1f4d5; 学习格言&#xff1a;博观而约取&#xff0…

【大语言模型】15分钟快速掌握LangChain以及ChatGLM

10分钟快速掌握LangChain LangChain简介LangChain中的核心概念1. Components and Chains2. Prompt Templates and Values3. Example Selectors4. Output Parsers5. Indexes and Retrievers6. Chat Message History7. Agents and Tookits LangChain的代码结构1. LangChain中提供…

二叉树前中后序的非递归实现

前言 &#xff1a; 递归我们会有一些问题的 为什么有递归就一定有非递归呢&#xff1f;&#xff1f;首先递归是有一定缺陷的 递归真正的缺陷是&#xff0c;每一个程序运行起来呢都是一个线程的形式&#xff0c;但是每一个线程都会有独立的栈空间&#xff0c;但是栈空间是很…

性能优化(一)JMeter使用

简介&#xff1a; jmeter 是 apache 公司基于 java 开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简 单。因为 jmeter 是 java 开发的&#xff0c;所以运行的时候必须…

Tkinter_鼠标选中样式

前言 使用tkinter库创建窗口应用程序示例&#xff0c;包含不同鼠标样式标签。 一、方法 import tkinter as tkclass Mouse_Style:def __init__(self):self.root tk.Tk()self.root.title(样式)self.root.geometry("200x5201100150")self.interface()def interface(…

Hbase drop 表卡住没有响应

在实际工作中遇到过重新创建一个hbase的hive外部表&#xff0c;在 disable table_name; drop table_name 在drop table_name卡住 最后有提示报错。 建议各位查看下表有无lock的情况&#xff0c; 查看和释放hbase lock可以通过如下方式来查看 pid获取&#xff1a; 在 Ma…

使用Go 语言的三个原因

几个星期前&#xff0c;我一个朋友问我&#xff1a;“为什么要关心 Go 语言”&#xff1f; 因为他们知道我热衷于 Go 语言&#xff0c;但他们想知道为什么我认为其他人也应该关心。有三个原因&#xff1a;安全性、生产力和并发性。有些语言可以涵盖一个也有可能是两个方面&…

网络互联设备(集线器、交换机、路由器)

文章目录 一、中继器和集线器二、网桥和交换机1&#xff09;交换机的三种转发方式2&#xff09;交换机的分类3&#xff09;交换机互连方式 三、路由及路由器1&#xff09;路由器的作用2&#xff09;路由器的逻辑结构3&#xff09;路由器的硬件组成4&#xff09;路由器启动过程 …

免费 Selenium各大浏览器驱动【谷歌chrme、火狐Firefox、IE浏览器】

aardio群 625494397 废话不多说 直接开整&#xff01; 竟然还有脸收费 服了 下载对应版本的浏览器驱动 目标网址 应用场景 Selenium库涉及到 安装selenium库 pip install selenium-i https://mirrors.aliyun.com/pypi/simple/下载对应浏览器驱动 https://registry.npmmirror.c…

STM32 DSP库CUBEMX配置+FFT频率计算

文章目录 前言一、DSP库添加1.1 加一个define1.2 添加文件路径1.3 主函数 二、FFT运算求频率2.1 初始版本版本2 总结 前言 使用DSP中的函数加快计算。 本文首先讲述如何通过添加dsp库。 再讲述使用DSP库进行实数FFT运算。&#xff08;FFT运算用到了前面讲述的STM32CubeMX-ADC …