秋招突击——6/19——新作{括号生成、合并K个排序链表}

文章目录

    • 引言
    • 新作
      • 括号生成
        • 个人实现
          • 实现时遇到的问题
          • 实现代码
        • 参考思路
          • 实现代码
      • 合并K个有序链表
        • 个人实现
            • 实现代码
        • 参考实现
          • 实现代码
    • 总结

引言

  • 今天把第二篇论文投了,后续有审稿意见再说,然后在进行修改的。
  • 后续的生活要步入正轨了,每天刷题,然后再背八股。

新作

括号生成

  • 题目链接
    在这里插入图片描述
个人实现
  • 之前做过一个题目,是验证括号是否合法,这道题是让生成括号。可以在暴力的基础上,进行括号合法性的验证。最终的思路如下
  • 有两种情况,验证括号的栈是否为空
    • 如果栈为空,
      • 还可以入栈,那就入栈
      • 所有括号已经匹配完毕,为空,将结果加入到res中
    • 如果栈不为空
      • 入栈
      • 出栈
  • 想的挺好的,但是实现起来比较困难,没有啥头绪,所以采用了最直接的方法进行暴力遍历所有的组合,然后判定是否符合要求,符合要求再添加对应的元素。时间复杂度是真的高 ,好在数据量并不多。
实现时遇到的问题
  • 排列组合应该怎么用代码实现,想了半天,写的有点不熟,自己一点点理出来的,应该好好记住才对。
    • 这里是使用dfs实现组合的。
实现代码

在这里插入图片描述

实现代码

#include <iostream>
#include <stack>
#include <vector>

using namespace std;

bool judge(string s){
    stack<char> st;
    for (auto c:s) {
        if (c == '(')   st.push(c);
        else{
            if (st.empty()) return false;
            else    st.pop();
        }
    }
    return st.empty();
}

vector<string> vt;
void dfs(string s,int t,int k){
    if (t == k){
        vt.push_back(s);
    }else{
        dfs(s + "(",t + 1,k);
        dfs(s + ")",t + 1,k);
    }
}

vector<string> generateParenthesis(int n){
    vector<string> res;
    dfs("",0,2*n);
    for (auto t:vt) {
        if (judge(t))   res.push_back(t);
    }
    return res;
}
int main(){

}
参考思路

下面这个是个好东西,经常用,需要呗

  • 一个合法的括号序列的充分必要条件

    • 任意前缀中,左括号的数量,大于等于右括号数量
    • 左右括号数量相等
  • 所以,第二个条件已经满足了,所以需要需要针对第一个条件进行计算

  • 使用递归来实现将所有合法方案输出的情况

    • 任何情况,都可以填左括号
    • 什么时候填右括号
      • 满足数量要求
      • 前缀的左括号数量的大于等于右括号
  • 定理:卡特兰数

实现代码

太牛逼了,这个代码写的真丝滑!!

vector<string> res;
void dfs(int n,int lc,int rc,string s){
    /*
     * n表示括号数量,lc表示左括号数量,rc表示右括号数量,s表示字符串
     */
    // 判定什么时候加左括号
    if (lc == n && rc == n) res.push_back(s); 
    else{
        // 什么时候加右括号
        if (lc < n) dfs(n,lc + 1,rc,s + "(");
        if (lc > rc && rc < n) dfs(n,lc,rc + 1,s + ")");
    }
}

vector<string> generateParenthesis(int n){
    dfs(n,0,0,"");
    return res;
}

实现过程中,有如下问题

  • 注意,实现判断的是否相等,不相等再加括号,相等了就不加括号
  • 如果加括号,再继续往下处理。

合并K个有序链表

  • 题目链接
    在这里插入图片描述
个人实现
  • 将所有的链表合成一个新的有序链表,有以下两个特征
    • 有序链表
    • 多个合成一个
  • 之前做过两个有序链表合成一个有序链表,用的两个指针同时比较,选择一个最小的然后进行链接。
  • 如果采用同样的方法,计算复杂度有点高,有什么别的办法吗?如果不行,就只能暴力了。
  • 最多是500个子队列,然后要维护500个指针。这个方法是不得行的。
  • 跳过,这个不会做。

还有什么思路
维系一个最值的队列

  • 计算每一个链表的最大值和最小值,然后比较对应的最值,根据最值进行链接。

如果最值就是数次链接,这道题只能这样遍历

实现代码

暴力匹配

  • 编程的具体实现就是,两两匹配,然后将第三者元素加入其中。将问题拆解。
  • 具体实现如下,头一次跑通了一个hard的题目,心情很不错,向这种拆解问题的思想,真的很好用呀!
/**
 * Definition for singly-linked list.
 * 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(vector<ListNode*>& lists) {
    auto dummy = new ListNode(-1);
    auto temp = dummy;
    for (auto t:lists) {
        temp->next = mergeTwoLists(temp->next,t);
        return dummy->next;
    }
    return dummy->next;
}

 ListNode* mergeTwoLists(ListNode* aNode,ListNode* bNode){
    auto dummy = new ListNode(-1);
    auto temp = dummy;
    while(aNode && bNode){
        if (aNode->val < bNode->val){
            temp->next = aNode;
            aNode = aNode->next;
        }else{
            temp->next = bNode;
            bNode = bNode->next;
        }
        temp = temp->next;
    }
    temp->next = aNode == nullptr ? bNode:aNode;
    return dummy->next;
}


};

在这里插入图片描述

参考实现
  • 使用堆来找最小值,改变时间复杂度有k变成logk

  • stl中的优先队列是使用堆进行排序的,所以这里使用优先队列进行实现。

    • 这里自定义优先队里的比较函数比较生僻,需要死记硬背

定义一个保存ListNode 的优先队列

  • 这个必须要记住,而且必须加上对应的容器
struct Cmp{
    bool operator()(ListNode* a,ListNode* b){
        return a->val > b->val;
    }
};

ListNode* mergeKLists(vector<ListNode*>& lists) {
   priority_queue<ListNode* ,vector<ListNode*>,Cmp> heap;
}
实现代码
  • 下面这个题写的真简洁,学到了。
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
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) {}
};

struct Cmp{
    bool operator()(ListNode* a,ListNode* b){
        return a->val > b->val;
    }
};

ListNode* mergeKLists(vector<ListNode*>& lists) {
   priority_queue<ListNode* ,vector<ListNode*>,Cmp> heap;
   auto dummy = new ListNode(-1),tail = dummy;
   for (auto t:lists)  if(t) heap.push(t);
   while(heap.size()){
       auto t = heap.top();
       heap.pop();
       tail->next = t;
       tail = tail->next;
       if (t->next) heap.push(t->next);
   }
   
   return dummy->next;
}

总结

  • 今天两道题基本上都写出来,但是效率都不高,学到了新的知识点,不错,明天继续。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS源码分析

目录 1、FreeRTOS目录结构 2、核心文件 3、移植时涉及的文件 4、头文件相关 4.1 头文件目录 4.2 头文件 5、内存管理 6、入口函数 7、数据类型和编程规范 7.1 数据类型 7.2 变量名 7.3 函数名 7.4 宏的名 1、FreeRTOS目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工…

Ubuntu服务器搭建Git远程仓库

本文所述方法适用于小型团队在局域网环境中使用Git进行代码版本管理。 1. 安装Git 打开终端(Ctrl + Alt + T) ,输入以下命令: sudo apt update #更新软件包列表信息 sudo apt install git #安装Git 验证Git是否安装成功,可以查看Git版本: git --version 也需…

shell中的流程控制

条件判断在流程控制中的重要性 有了条件判断才能进行if判断即分支流程&#xff0c;才能进行case的多分支流程&#xff0c;才能进行for循环和while循环。 单分支流程判断 如上图所示&#xff0c;在shell编程中常使用英文状态下的分号来在Linux控制台一次性执行多条命令&#x…

无线领夹麦克风哪个牌子好用?一文揭秘哪种领夹麦性价比最高!

​无线领夹麦克风&#xff0c;无疑是现代音频技术的杰出代表。它摆脱了传统有线麦克风的束缚&#xff0c;让声音的传播更加自由、灵活。无论是追求极致音质的音乐爱好者&#xff0c;还是需要高效沟通的商务人士&#xff0c;无线领夹麦克风都能满足你的需求&#xff0c;让你的声…

513、找二叉树左下角的值

题解&#xff1a;层序遍历简单&#xff0c;此篇记录递归法&#xff0c;要注意左下角的值并不一定是左叶子节点&#xff0c;遍历思路形象化就是按先左后右的顺序遍历每一条分支&#xff0c;若遍历到叶子结点&#xff0c;看此时深度有没有超过之前的值&#xff0c;超过了就记录下…

Jlink下载固件到RAM区

Jlink下载固件到RAM区 准备批处理搜索exe批处理调用jlink批处理准备jlink脚本 调用执行 环境&#xff1a;J-Flash V7.96g 平台&#xff1a;arm cortex-m3 准备批处理 搜索exe批处理 find_file.bat echo off:: 自动识别脚本名和路径 set "SCRIPT_DIR%~dp0" set &qu…

TIME_WAIT的危害

前言 该文章主要讨论下TIME_WAIT的存在意义和潜在危害&#xff0c;以及解决措施。 具体内容 首先看一下下面这幅图 这幅图来自《TCP IP详解卷1&#xff1a;协议 原书第2版中文》TCP状态变迁图。 TIME_WAIT存在意义 可靠的终止TCP连接。 保证让迟来的TCP报文有足够的时间被…

数据库 | 试卷四

1.数据库系统的特点是 数据共享、减少数据冗余、数据独立、避免了数据不一致和加强了数据保护 2.关系模型的数据结构是二维表结构 3.聚簇索引 cluster index 4. 这里B&#xff0c;C都是主属性&#xff0c;所以B->C不是非主属性对码的部分函数依赖 候选键&#xff08;AC&a…

光电液位传感器在净水器领域的应用优势有哪些?

光电液位传感器作为一种先进的液位检测技术&#xff0c;在净水器领域有着显著的应用优势。具有高精度的特点&#xff0c;能够精确地检测水位变化&#xff0c;保证水处理过程的稳定性和效率。 传统的浮球式传感器可能存在精度偏差或者在长期使用中需要维护和更换的问题&#xf…

nginx+tomcat负载均衡、动静分离群集【☆☆☆☆☆】

Nginx是一款非常优秀的HTTP服务器软件&#xff0c;性能比tomcat更优秀&#xff0c;它支持高达50 000个并发连接数&#xff0c;拥有强大的静态资源处理能力&#xff0c;运行稳定&#xff0c;内存、CPU等系统资源消耗非常低。目前很多大型网站都应用Nginx服务器作为后端网站程序的…

机器学习课程复习——隐马尔可夫

不考计算题 Q:概率图有几种结构? 条件独立性的公式? 顺序结构发散结构汇总结构Q:隐马尔可夫模型理解? 概念 集合:状态集合、观测集合 序列:状态序列、观测序列

你不知道的MySQL备份和还原技巧,速来学习!

01、mysql备份数据库 1、mysql备份单个数据库 #mysql备份某个库格式&#xff1a; mysqldump -h主机名 -P端口 -u用户名 -p"密码" --database 数据库名 > 文件名.sql#实例&#xff1a;mysql备份某个库&#xff1a; mysqldump -h10.*.*.9 -P3306 -uroot -p"密…

闹大了!高考作文“人工智能与AI”引发争议,专家喊话,部分考生家长无奈,直呼:“太不公平了!这哪里是考作文,分明是在考城乡差距啊!”

闹大了&#xff01;高考作文“人工智能与AI”引发争议&#xff0c;专家喊话&#xff0c;部分考生家长无奈&#xff0c;直呼&#xff1a;“太不公平了&#xff01;这哪里是考作文&#xff0c;分明是在考城乡差距啊&#xff01;” ​高考&#xff0c;本该是最公平的战场&#xff…

leetcode21 合并两个有序单链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[]示例…

YOLOv10改进 | 主干篇 | YOLOv10引入华为VanillaNet替换Backbone

1. VanillaNet介绍 1.1 摘要: 基础模型的核心是“越多越好”的理念,计算机视觉和自然语言处理领域取得的惊人成功就是例证。 然而,优化的挑战和变压器模型固有的复杂性要求范式向简单性转变。 在这项研究中,我们介绍了 VanillaNet,一种设计优雅的神经网络架构。 通过避免…

【Docker系列】深入解析 Docker 容器部署脚本

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Shardingsphere-Proxy 5.5.0部署

Shardingsphere-Proxy 5.5.0部署 Shardingsphere系列目录&#xff1a;背景下载安装包Linux解压安装包修改配置文件global.yamldatabase-sharding.yaml配置没有单表情况配置有单表的情况背景 引入数据库驱动启动代理连接代理数据库Navicate工具连接MYSQL客户端连接 Shardingsphe…

华为IPD体系中三大流程之IPD流程的六个阶段和七个评审点介绍

概念 IPD集成产品开发&#xff0c;英文是IntegratedProduct Development&#xff0c;是一整套科学的研发创新管理方法论&#xff0c;将产品经营管理思想和理念置入到新产品开发和产品管理过程中&#xff0c;因此IPD是不仅是一套研发管理体系&#xff0c;更是一套产品经营管理体…

浸没式液冷服务器的换热效率及节能潜力分析

服务器浸没式液冷的换热效率及节能潜力 摘要&#xff1a;我们针对服务器浸没式液冷实验台进行了深入测试&#xff0c;探究了不同室外温度和服务器发热功率对系统制冷PUE的影响。实验数据显示&#xff0c;该系统的制冷PUE值介于1.05至1.28之间&#xff0c;高效节能特点显著。 在…

报表控件Stimulsoft 图表轴的日期时间步长模式

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能&#xff0c;Stimulsoft Ultimate包含了…