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

news2025/2/26 17:53:56

文章目录

    • 引言
    • 新作
      • 括号生成
        • 个人实现
          • 实现时遇到的问题
          • 实现代码
        • 参考思路
          • 实现代码
      • 合并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;
}

总结

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

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

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

相关文章

21.0docker企业级镜像仓库harbor(vmware 中国团队)

docker企业级镜像仓库harbor(vmware 中国团队) 网站下载harbor软件包 https://github.com/goharbor/harbor 查看软件安装harbor版本需求限制 本地环境需求已满足 点击下载harbor安装包 点击releases根据版本信息下载 下面的在线安装就是docker pull。离线就是下载之后…

上海中腾食品科学餐饮管理铸就企业食堂新模式

在当今企业运营中&#xff0c;食堂不仅是员工用餐的场所&#xff0c;更是企业文化和管理水平的体现。随着餐饮行业的不断发展&#xff0c;科学合理的餐饮管理模式成为了企业食堂成功的关键。上海中腾食品科技有限公司以其独特的餐饮管理模式&#xff0c;成功打造了企业食堂的新…

CSS3中鲜为人知但非常强大的 Clip-Path 属性

CSS3中鲜为人知但非常强大的 Clip-Path 属性 在CSS3中,clip-path属性可以让我们快速创建各种各样的不规则图形,而无需使用图片或者复杂的绘图工具。它可以帮助我们实现一些非常出色的视觉效果,但遗憾的是它并不是很常见。 clip-path属性可以接受多种不同的值,比如polygon()、…

AI网络爬虫:用deepseek批量提取coze扣子的智能体数据

动态加载页面&#xff0c;返回json数据&#xff1a; 翻页规律&#xff1a; https://www.coze.cn/api/marketplace/product/list?entity_type1&keyword&page_num17&page_size24&sort_type1&source1&msToken8_renFdIfix-XVFJAqAj8F_gSPv1V5A8NX_iL2teO…

【Java学习笔记】异常处理

生活中我们在使用一些产品的时候&#xff0c;经常会碰到一些异常情况。例如&#xff0c;使用ATM机取钱的时&#xff0c;机器会突然出现故障导致无法完成正常的取钱业务&#xff0c;甚至吞卡&#xff1b;在乘坐地铁时&#xff0c;地铁出现异常无法按时启动和运行&#xff1b;使用…

windows pyenv-win:pyenv 下载过慢

先到官网下载指定版本的 exe 文件 Python Releases for Windows | Python.org 根据自己电脑的 下载 32 或者 64 下载完成后将 exe 放入 install_cache 再到 powershell 中执行安装指令 pyenv install 3.12.4

LLM漫谈(七)| 使用PyTorch从零构建LLM

LLM是最流行AI聊天机器人的核心基础&#xff0c;比如ChatGPT、Gemini、MetaAI、Mistral AI等。在每一个LLM&#xff0c;有个核心架构&#xff1a;Transformer。我们将首先根据著名的论文“Attention is all you need”-https://arxiv.org/abs/1706.03762 来构建Transformer架构…

天津媒体邀约,及媒体名单?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 天津作为中国北方的重要城市&#xff0c;拥有丰富的媒体资…

OpenCV 车道检测

OpenCV 车道检测 前言模型分析车道检测相关链接 前言 如果要检测道路图像中的车道&#xff0c;方法之一是利用深度学习的语义分割技术。而在 OpenCV 中解决此问题可以使用边缘检测器。在本节中&#xff0c;我们将了解如何使用边缘检测和直线检测识别道路图像中的车道。 模型分…

C语言----自定义类型:联合和枚举

1.联合体 联合体的特点 像结构体一样&#xff0c;联合体也是一个或者多个成员构成的&#xff0c;这些成员可以是不同的类型 联合体的关键字&#xff1a;union 结构体的关键字&#xff1a;struct 枚举的关键字&#xff1a;enum 但是编译器只为最⼤的成员分配⾜够的内存空间…

如何查看公网IP?

什么是公网IP&#xff1f; 公网IP&#xff08;Internet Protocol&#xff09;是指分配给互联网上的计算机设备的唯一标识符。公网IP地址是由互联网服务提供商&#xff08;ISP&#xff09;分配给用户设备&#xff0c;使其可以与全球范围内的其他设备进行通信。公网IP地址通常采…

Internet Download Manager(IDM6.41)软件最新版下载及详细安装教程

​根据行业数据显示支持多款浏览器&#xff0c;包括IE&#xff0c;Safari&#xff0c;谷歌浏览器&#xff0c;火狐&#xff0c;MSN还有opera &#xff0c;通过自带的添加浏览器功能能够支持所有浏览器。实际上 一键下载所选文件&#xff1a;当在浏览器中用鼠标选择多个链接时&…

Spring Boot轻松整合Minio实现文件上传下载功能

一、Linux 安装Minio 安装 在/root/xxkfz/soft目录下面创建文件minio文件夹&#xff0c;进入minio文件夹&#xff0c;并创建data目录&#xff1b; [rootxxkfz soft]# mkdir minio [rootxxkfz soft]# cd minio [rootxxkfz minio]# mkdir data执行如下命令进行下载 [rootxxkfz…

【漏洞复现】极限OA video_file.php 任意文件读取漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

在 Mac 上恢复已删除的文件夹

“嗨&#xff0c;我刚刚运行了重复文件查找器应用程序 Gemini 来扫描我的 Mac 以清除重复文件。它找到了很多重复的文件和文件夹&#xff0c;只需单击一下&#xff0c;它就可以帮助我删除重复的文件/文件夹。但我认为它可能会删除一些有用的重复文件。我打开垃圾箱&#xff0c;…

Docker环境离线安装

Docker环境离线安装 下载下列.deb包 sudo *.deb

CFD笔记

CFD 定常流动与非定常流动 定常流动&#xff1a;流体流动过程中各物理量均与时间无关; 非定常流动&#xff1a;流体流动过程中某个或某些物理量与时间有关. 运动黏度 运动粘度定义&#xff1a; v μ ρ v \frac{\mu}{\rho} vρμ​&#xff0c;其中 μ \mu μ​表示粘度…

成为前端开发负责人之前,你需要具备8个能力

自己开发前端和带领团队开发前端&#xff0c;基本是两码事&#xff0c;有些小伙伴个人能力很强&#xff0c;给他一个团队&#xff0c;他就抓瞎了&#xff0c;结果就变成了一人在战斗了&#xff0c;贝格前端工场结合多年经验&#xff0c;分析一下成为前端负责人要具备啥能力。 …

刷代码随想录有感(109):动态规划——01背包问题|一和零

题干&#xff1a; 代码 : class Solution { public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>>dp(m 1, vector<int>(n 1, 0));dp[0][0] 0;for(string i : strs){int oneNum 0;int zeroNum 0;for(char c : i…

SolidWorks软件天津代理商:官方授权亿达四方,企业的信赖之选

在快速发展的制造业领域&#xff0c;设计与创新是推动企业持续前进的核心动力。作为世界领先的三维机械设计解决方案&#xff0c;SolidWorks以其强大的功能、直观的操作界面以及高效的协作能力&#xff0c;成为众多天津企业加速产品开发周期、提升市场竞争力的首选工具。而在天…