Leetcode 21-25题

合并两个有序链表

将两个升序链表合并为一个新的升序链表。

用两个指针指向两个链表的表头,然后每次比较一下哪个值小,将较小的节点接到答案后面即可。

ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {auto dummy = new ListNode(), p = dummy;auto l1 = list1, l2 = list2;while(l1 && l2) {   // 当l1和l2都不为空才进入循环if(l1->val <= l2->val) {p->next = l1;   // 将l1节点接到答案尾部p = p->next;    // 将答案和l1后移l1 = l1->next;}else {p->next = l2;p = p->next;l2 = l2->next;}}if(l1)  p->next = l1;if(l2)  p->next = l2;return dummy->next;
}

括号生成

n n n对括号,生成所有可能并且有效的括号组合。

有效的就是要满足任意前缀中左括号的数量一定大于等于右括号的数量。

然后做DFS,每次递归时都要保证左括号数量大于等于右括号数量。

也就是说,只有左括号数量大于右括号数量时,才可以放右括号。(前提是还有右括号可以放)

vector<string> ans;void dfs(int n, int l, int r, string path) {if(l == n && r == n) {          // 左右括号都放满了则输出ans.push_back(path);return ;}if(l != n)  dfs(n, l + 1, r, path + "(");       // 若有左括号就可以直接放if(r != n && l > r) dfs(n, l, r + 1, path + ")");   // 若有右括号且前缀中左括号数量严格大于右括号数量则可以放
}vector<string> generateParenthesis(int n) {dfs(n, 0, 0, "");return ans;
}

合并K个升序链表

给定一个链表数组,每个链表均为升序排列,将所有链表合并到一个升序链表中。

本质上和合并两个有序链表相似,即每次找最小的节点并接到答案后面。但是这样每次找会有 O ( k ) O(k) O(k)的比较次数。

因此可以采用堆优化来查找最小值,即每次把每个链表都存一个节点到堆中,取最小值接到答案后面,是 O ( 1 ) O(1) O(1)的比较次数。

优先队列默认是大根堆,要重载小于号才能变成小根堆,如priority_queue<int, vector< int>, greater< int>> q;

若要重载其他数据结构的小于比较,需要仿函数来重载。

struct cmp {bool operator() (ListNode* a, ListNode* b) {    // 仿函数return a->val > b->val;                     // 重载为大于}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {auto dummy = new ListNode(), p = dummy;priority_queue<ListNode*, vector<ListNode*>, cmp> heap;for(auto list : lists)  if(list)    heap.push(list);    // 样例2中有空链表while(!heap.empty()) {auto list = heap.top();         // 队头是最小的节点heap.pop();p->next = list;p = p->next;if(list->next)  heap.push(list->next);}return dummy->next;
}

两两交换链表中的节点

两两交换链表中相邻的节点,并返回交换后链表的头节点。

所有链表题,只要涉及到头节点的判断问题,都可以加一个虚拟头节点

head -> 1 -> 2 -> 3 -> 4 -> tail
head -> 2 -> 1 -> 3 -> 4 -> tail

要实现上述链表的两两交换,比如要交换1和2节点,需要将head指向2,将1指向3,将2指向1,实现这三步即可。

i -> j -> k -> l
交换j和k
i->next = k
j->next = k->next
k->next = j
ListNode* swapPairs(ListNode* head) {auto dummy = new ListNode(-1, head), p = dummy;while(p->next && p->next->next) {// p -> a -> bauto a = p->next, b = a->next;p->next = b;a->next = b->next;b->next = a;if(p->next->next)   p = p->next->next;}return dummy->next;
}

K个一组翻转链表

将链表每 k k k个节点一组进行翻转,返回修改后的链表。如果节点总数不是 k k k的整数倍,最后剩余的节点保持原有顺序。

head -> 1 -> 2 -> 3 -> 4 -> 5 -> tail
head -> 4 -> 3 -> 2 -> 1 -> 5 -> tail
head    1 <- 2 <- 3 <- 4    5 -> taila    ba    ba    b

我们采取这样的策略,先改变内部的方向,内部都更改完之后,再更改两边的指向关系,如下代码和示意图:

ListNode* reverseKGroup(ListNode* head, int k) {auto dummy = new ListNode(-1, head);for (auto p = dummy;;) {auto q = p;for (int i = 0; i < k && q; i ++ ) q = q->next;if (!q) break;      // 以上为判断后面是否还有k个元素// head -> 1 -> 2 -> 3 -> 4 -> 5 -> tail//    p    a    b//    p         a    b//    p              a    bauto a = p->next, b = a->next;for (int i = 0; i < k - 1; i ++ ) {// a -> b -> cauto c = b->next;// a <- b  cb->next = a;// 移动到下一轮更改的位置a = b, b = c;}// head    1 <- 2 <- 3 <- 4    5 -> tail//    p    c              a    b// head    4 -> 3 -> 2 -> 1    5 -> tail//    p    a              c    bauto c = p->next;p->next = a, c->next = b;// head -> 4 -> 3 -> 2 -> 1 -> 5 -> tail//                        pp = c;}return dummy->next;
}

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

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

相关文章

EI级 | Matlab实现TCN-GRU-MATT、TCN-GRU、TCN、GRU多变量时间序列预测对比

EI级 | Matlab实现TCN-GRU-MATT、TCN-GRU、TCN、GRU多变量时间序列预测对比 目录 EI级 | Matlab实现TCN-GRU-MATT、TCN-GRU、TCN、GRU多变量时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 【EI级】Matlab实现TCN-GRU-MATT、TCN-GRU、TCN、GRU多变量时间…

云原生概念

云原生是一条使用户能&#xff1a; 1.低运维、 2.敏捷的、 3.以可扩展、可复制的方式&#xff0c; 最大化的利用”云“的能力、发挥”云“的价值的最 佳路径 云原生&#xff0c;是一条最佳路径或实践 参考&#xff1a;https://edu.aliyun.com/course/314164/lesson/7815

JavaScript 中实现常见数据结构:栈、队列与树

文章目录 JavaScript 中实现常见数据结构&#xff1a;栈、队列与树引言一、栈&#xff08;Stack&#xff09;二、队列&#xff08;Queue&#xff09;三、树&#xff08;Tree&#xff09;结语与祝福代码 JavaScript 中实现常见数据结构&#xff1a;栈、队列与树 引言 在前端开…

【已解决】引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。

这种问题产生一般都会手足无措&#xff0c;包括笔者&#xff0c;但是不要慌&#xff0c;这种问题一般都是内存泄漏引起的。例如读者要访问一个已经被析构或者释放的变量&#xff0c;当然访问不了&#xff0c;导致存在问题。这时候读者应该从哪里产生内存泄漏这方面进行考虑&…

【VSCode】设置 一键生成vue模板 的快捷入口

问题 每次写一个组件的时候&#xff0c;都需要去手敲默认结构或者是复制粘贴&#xff0c;十分的麻烦&#xff01; 解决办法 文件 > 首选项 > 用户代码片段 > vue.json 配置vue模板 其中prefix是用来触发代码段的内容&#xff0c;即模版的快捷入口&#xff1b;body里…

【SpringBoot2】Spring容器的本质就是两个HashMap

做为Java程序员,我们就是Spring的用户,Spring的影子在我们的代码里几乎是无处不在,那Spring到底是什么,带给我们什么,如何工作的呢?这个简单问题貌似又不太好讲。例如如果要问一下什么是Spring框架, 可以找到大量的解答,基本内容如下: Spring是一个开源的应用程序框架…

【Funny Game】 吃豆人

目录 【Funny Game】 吃豆人 吃豆人 文章所属专区 Funny Game 吃豆人 吃豆人&#xff0c;这款经典游戏如今依旧魅力四射。玩家需操控小精灵&#xff0c;在迷宫内吞噬所有豆子&#xff0c;同时避开狡猾的鬼怪。当吃完所有豆子后&#xff0c;便可消灭鬼怪&#xff0c;赢得胜利。…

springboot197基于springboot的毕业设计系统的开发

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的毕业设计系统的开发 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 …

[AIGC] 利用 ChatGpt 深入理解 Java 虚拟机(JVM)的内存分布

深入理解 Java 虚拟机&#xff08;JVM&#xff09;的内存分布 Java 虚拟机&#xff08;JVM&#xff09;是 Java 编程语言的核心运行环境&#xff0c;它负责解释和执行 Java 字节码。在 JVM 中&#xff0c;内存被划分为几个不同的区域&#xff0c;每个区域都有特定的用途。了解…

stack的用法

介绍 翻译为栈&#xff0c;是一个后进先出的容器。 访问 只能通过top()函数来访问栈顶元素 常用函数 1.push(x):将x入队 2.top():获得队首元素 3.empty():判断是否为空 4.size():返回队内元素个数 #include <iostream> #include <stack>//引用stack头文件 us…

c++作业

Shell中的函数&#xff08;先调用后使用的原则&#xff09;&#xff08;没有申明&#xff09; &#xff08;Function&#xff09; 函数名&#xff08;有没有参数根据调用格式&#xff09;&#xff08;不能写任何内容&#xff09; { 函数体 Return 返回值 } 函数名 ----》…

Go语言中的加密艺术:深入解析crypto/subtle库

Go语言中的加密艺术&#xff1a;深入解析crypto/subtle库 引言crypto/subtle库概览ConstantTimeCompare函数深入解析ConstantTimeSelect函数应用详解ConstantTimeLessOrEq函数实践指南安全编程实践性能优化与最佳实践与其他加密库的比较总结 引言 在当今快速发展的互联网时代&…

作为一个程序员,最少要看过这几部电影吧?

计算机专业必看的几部电影 计算机专业必看的几部电影&#xff0c;就像一场精彩的编程盛宴&#xff01;《黑客帝国》让你穿越虚拟世界&#xff0c;感受高科技的魅力&#xff1b;《社交网络》揭示了互联网巨头的创业之路&#xff0c;《源代码》带你穿越时间解救世界&#xff0c;…

SG5032EEN晶体振荡器SPXO

5G将使通信流量呈指数级增长&#xff0c;5G通信网络需要高速和宽带&#xff0c;同时将噪声水平保持在最低水平&#xff0c;这可以通过通信设备的高频低抖动参考时钟来实现&#xff0c;使用上述晶体振荡器SPXO&#xff0c;客户可以输入一个具有极低相位抖动和功率的高频参考时钟…

P5194 Scales S——dfs(前缀和剪枝)

传送门https://www.luogu.com.cn/problem/P5194手切第一遍&#xff0c;没想到可以用前缀和剪枝&#xff0c;并且是从小到大搜了&#xff0c;不出意外40分TLEWA 第二遍&#xff1a;代码及思路 // Problem: // P5194 [USACO05DEC] Scales S // // Contest: Luogu // UR…

施美药业回复监管“二十问”:业务信披存疑,最大客户为关联方

近日&#xff0c;江西施美药业股份有限公司&#xff08;下称“施美药业”&#xff09;更新在深交所主板上市的申请审核动态&#xff0c;对深交所于2023年7月24日发布的第一轮审核问询函进行了回复。目前&#xff0c;深交所已发出第二轮审核问询函。 具体而言&#xff0c;施美药…

1、安装docker

$ sudo apt-get update安装 apt 依赖包&#xff0c;用于通过HTTPS来获取仓库: $ sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common添加 Docker 的官方 GPG 密钥&#xff1a; $ curl -fsSL https://mirrors.ustc.…

java:Java中的逻辑控制

顺序结构 在Java中&#xff0c;顺序结构是指代码按照从上到下的顺序依次执行。以下是一个简单的Java程序示例&#xff0c;展示了顺序结构的使用&#xff1a; public class SequenceStructureExample {public static void main(String[] args) {// 声明和初始化变量int num1 10…

cookie+session和token

总结说在前面&#xff1a; session&#xff1a;起源于服务端&#xff0c;保存在服务端&#xff08;服务器或者数据库&#xff09;&#xff0c;通过cookie传递给用户&#xff0c;用户每一次发送HTTP请求的时候&#xff0c;通过验证cookie中的session-id来验证用户身份。jwt(jso…

【C++关键字】auto以及指针空值nullpr

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 前言1.类型别名思考2…