当前位置: 首页 > news >正文

LeetCode Top100 Liked 题单(序号19~)

19. Remove Nth Node From End of List

题意:给一个链表,删除从尾数起的第n个结点,返回头节点。

我的思路

指针到最后,数出来有多少个,之从前向后数,再删掉节点

代码 10ms Beats 16.06%

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode * p=head;int sz=0;while(p!=NULL){cout<<p->val<<endl;p=p->next; sz++;   }p=head; int ta=sz-n;if(ta==0){head=p->next;delete p;p=NULL; return head;}for(int i=1;i<ta;i++)p=p->next;ListNode * q=p->next;p->next=q->next;delete q;p=q=NULL;return head;}
};

标答

双指针,类似追及问题的那种

第一个指针和第二个指针指向head,让第一个指针先跑n个结点,之后第一个指针和第二个指针一起跑,直到第一个指针跑到尾,这时第二个指针就是倒数第n个结点了,删除第二个指针指向的结点就可以了

注意第一个指针为空的情况单独讨论

代码 0ms Beats 100.00% 10.49mb Beats 99.85% 双指针

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode * fr=head;ListNode * se=head;for(int i=1;i<=n;i++)  fr=fr->next;if(fr==NULL){head=head->next;delete se; se=NULL;return head;}while(fr->next!=NULL){fr=fr->next;se=se->next;}fr=se->next; se->next=fr->next;delete fr;fr=NULL;return head;}
};

20. Valid Parentheses

题意:括号合法问题

我的思路

用栈看看合不合法

代码 0ms Beats 100.00% 6.40mb Beats 36.00% 栈

好像空间复杂度没办法在当前的时间复杂度下优化了

class Solution {
public:bool isValid(string s) {stack<char> st;for(int i=0;i<s.size();i++){if(s[i]==')'){if(st.empty())return 0;char a=st.top();st.pop();if(a!='(')return 0;}else if (s[i]==']'){if(st.empty())return 0;char a=st.top();st.pop();if(a!='[')return 0;}else if (s[i]=='}'){if(st.empty())return 0;char a=st.top();st.pop();if(a!='{')return 0;}else st.push(s[i]);}if(st.empty())return 1;return 0;}
};

21. Merge Two Sorted Lists

题意:把两个有序链表合成一个有序链表

我的思路

就直接合成

代码 3ms Beats 96.79% 14.72mb Beats 53.74%

class Solution {
public:ListNode* mergeTwoLists(ListNode* l, ListNode* r) {ListNode* ans=NULL;ListNode* m=ans;if(l!=NULL&&r==NULL){return l;}else if(l==NULL&&r!=NULL){return r;}else if(l==NULL&&r==NULL){return ans;}while(l!=NULL&&r!=NULL){if((l->val)<=(r->val)){if (m==NULL){ans=m=l;l=l->next;}else {m->next=l;m=m->next;l=l->next;}}else{if (m==NULL){ans=m=r;r=r->next;}else {m->next=r;m=m->next;r=r->next;}}}if(l!=NULL){m->next=l;}else if(r!=NULL){m->next=r;}return ans;}
};

22. Generate Parentheses

题意:给出括号数,生成所有可能性

我的思路 递归

递归,当右括号数用完的时候跳出递归,同时时刻注意左括号数一定要 大于等于 右括号数

代码 0ms Beats 100.00% 11.26mb Beats 91.80%

class Solution {
public:void solve(int n,int l,int r,vector<string> &ans,string &output){if(r==n){ans.push_back(output);return;}if(l>=r&&l<n){output.push_back('(');solve(n,l+1,r,ans,output);output.pop_back();}if(l>r){output.push_back(')');solve(n,l,r+1,ans,output);output.pop_back();}}vector<string> generateParenthesis(int n) {if(n==0) return {};int l=0,r=0;vector<string> ans;string output;solve(n,l,r,ans,output);return ans;}
};

标答 动态规划

看了看答案 除了递归 还有动态规划的做法,有点像矩阵连乘的动态规划

将问题看成重叠子问题,假设dp[i]包含所有长度为2*i的可能性,例如dp[2]为{ (()) , ()() },那么dp[3]可以被写成:

( + dp[0] + ) + dp[2] = ()(()),()()()
( + dp[1] + ) + dp[1] = (())()
( + dp[2] + ) + dp[0] = ((())),(()())

从上面可以看出,这是个重叠子问题结构(其个数为卡特兰数

状态转移函数为dp[i] = "(" + dp[j] + ")" + dp[i-j-1]

接下来从数据结构的角度来说,答案在dp[n]中,dp[n]是vector<string>,所以dp的数据结构是vector<vector<string>>,dp[left] 和 dp[right] 也是vector<string>

之后就可以写代码了 注意初始化怎么写!!!

代码 0ms Beats 100.00% 7.36mb Beats 97.26%

class Solution {
public:vector<string> generateParenthesis(int n) {vector< vector<string> > dp(n+1);//开辟空间dp[0]={""};//初始化for(int i=1;i<=n;i++){//动态规划中的nfor(int j=0;j<i;j++){//是状态转移方程中括号里的内容 也就是第几个左for(int l=0;l<dp[j].size();l++){for(int r=0;r<dp[i-j-1].size();r++){string output;output+="(";output+=dp[j][l];output+=")";output+=dp[i-j-1][r];dp[i].push_back(output);}}}}return dp[n];}
};

23. Merge k Sorted Lists

题意:你有一个链表组,排序成一个链表

我的思路

递归,两个两个合并,有种归并排序的意思,但是代码能不能写出来就不知道了呜呜呜;

还有注意链表为空的情况!想了想之前有两个链表排序的例子,不知道能不能用上

但是递归完后,合成的链表放在哪里呢?那就新开一个vector ans,把之前的list clear一下(?)

每个拿到手的list,如果到手的就一个内容return;到手是1个以上,分成【l, r/2】【r/2+1,r】每个函数返回的应该是一个链表,ans把上面两个返回量收集一下,之后合并函数,最后返回一个链表

不会写!!感觉就差一点,但已知runtime error 没办法了;只好写个顺序版的了呜呜呜

代码  115ms Beats 28.75% 12.85 MB 98.25%

class Solution {
public:ListNode* mergeTwoLists(ListNode* l, ListNode* r) {ListNode* ans=NULL;ListNode* m=ans;if(l!=NULL&&r==NULL){return l;}else if(l==NULL&&r!=NULL){return r;}else if(l==NULL&&r==NULL){return ans;}while(l!=NULL&&r!=NULL){if((l->val)<=(r->val)){if (m==NULL){ans=m=l;l=l->next;}else {m->next=l;m=m->next;l=l->next;}}else{if (m==NULL){ans=m=r;r=r->next;}else {m->next=r;m=m->next;r=r->next;}}}if(l!=NULL){m->next=l;}else if(r!=NULL){m->next=r;}return ans;}ListNode* mergeKLists(vector<ListNode*>& lists) {if (lists.size()==0){return NULL;}else if (lists.size()==1){return lists[0];}for(int i = 1; i < lists.size(); i++){lists[0] = mergeTwoLists(lists[0],lists[i]);}return lists[0];}
};

标答 是对半 但不是递归

首先先把[0, n-1],[1, n-2],[2, n-3],[3, n-4]…[n/2-1,n-n/2] 配对合并,把链表放在前者里面,之后合法长度变为(n+1)/2;

以上流程循环,直到n<=1;

代码 12ms Beats 99.55% 12.94mb Beats 92.23% 对半非递归  

class Solution {
public:ListNode* mergeTwoLists(ListNode* l, ListNode* r) {ListNode* ans=NULL;ListNode* m=ans;if(l!=NULL&&r==NULL){return l;}else if(l==NULL&&r!=NULL){return r;}else if(l==NULL&&r==NULL){return ans;}while(l!=NULL&&r!=NULL){if((l->val)<=(r->val)){if (m==NULL){ans=m=l;l=l->next;}else {m->next=l;m=m->next;l=l->next;}}else{if (m==NULL){ans=m=r;r=r->next;}else {m->next=r;m=m->next;r=r->next;}}}if(l!=NULL){m->next=l;}else if(r!=NULL){m->next=r;}return ans;}ListNode* mergeKLists(vector<ListNode*>& lists){int n=lists.size();if(lists.size()==0) return NULL;while(n>1){for(int i=0;i<n/2;i++)lists[i] = mergeTwoLists(lists[i], lists[n-i-1]);n = (n+1)/2;}return lists.front();}};

标答 使用递归合并的

 mergeTwoLists函数和mergeKLists函数都差不多,重点在于sol是怎么实现的?

哦哦对照了一下,好像是在递归的时候传参传错了

正确的应该是:

        int mid=l+(r-l)/2;
        ListNode* a=sol(l,mid,lists);
        ListNode* b=sol(mid+1,r,lists);

我写的错误版本是:
        ListNode* a=sol(l,r/2,lists);
        ListNode* b=sol(r/2+1,r,lists);

为什么我写的是错误的呢?

假设lists的内容是0 1 2 3

0  1       2  3

00 11   21 23

会出现以上错误,也就是说,当l=2,r=3的时候会出现错误!!所以要用mid来解决

代码 12ms Beats 99.55% 12.94mb Beats 92.23%

class Solution {
public:ListNode* mergeTwoLists(ListNode* l, ListNode* r) {ListNode* ans=NULL;ListNode* m=ans;if(l!=NULL&&r==NULL){return l;}else if(l==NULL&&r!=NULL){return r;}else if(l==NULL&&r==NULL){return ans;}while(l!=NULL&&r!=NULL){if((l->val)<=(r->val)){if (m==NULL){ans=m=l;l=l->next;}else {m->next=l;m=m->next;l=l->next;}}else{if (m==NULL){ans=m=r;r=r->next;}else {m->next=r;m=m->next;r=r->next;}}}if(l!=NULL){m->next=l;}else if(r!=NULL){m->next=r;}return ans;}ListNode* sol(int l,int r,vector<ListNode*>& lists){if(l>=r)return lists[l];int mid=l+(r-l)/2;ListNode* a=sol(l,mid,lists);ListNode* b=sol(mid+1,r,lists);return mergeTwoLists(a,b);}ListNode* mergeKLists(vector<ListNode*>& lists) {if (lists.size()==0){return NULL;}return sol(0,lists.size()-1,lists);}
};

标答 优先队列

首先创建一个链表指针的优先队列q,接着把list的头指针都放进去,如果q是空的,那么就返回空;创建答案链表的头指针头指针指向当前堆顶的最小元素,把堆顶元素弹出,如果答案指针之后还有元素,那么就把答案指针的next放回堆中;

创建一个用于答案链表插入的尾指针,尾指针指向堆顶元素,堆顶元素弹出,尾指针指向next元素;如果尾指针next不为空,并放回堆中直到优先队列q空了,循环停止,这时答案链表也形成了。

代码 14ms Beats 99.29% 13.16mb Beats 82.20%

class Solution {
public:
struct compare {bool operator()(const ListNode* l, const ListNode* r) {return l->val > r->val;}
};
ListNode *mergeKLists(vector<ListNode *> &lists) { //priority_queuepriority_queue<ListNode *, vector<ListNode *>, compare> q;for(auto l : lists) {if(l)  q.push(l);}if(q.empty())  return NULL;ListNode* result = q.top();q.pop();if(result->next) q.push(result->next);ListNode* tail = result;            while(!q.empty()) {tail->next = q.top();q.pop();tail = tail->next;if(tail->next) q.push(tail->next);}return result;
}
};

!标答 直接输入的 但我应该学不会的

代码 5 ms Beats 99.82% 6.2 MB Beats 99.90%

int main()
{ios_base::sync_with_stdio(false);cin.tie(nullptr);ofstream out("user.out");vector<char> buf;constexpr size_t buf_size = 1e4;buf.resize(buf_size);out.rdbuf()->pubsetbuf(buf.data(), buf_size);vector<int> result;result.reserve(1e4);string in;while (getline(cin, in)){result.clear();for (size_t i = 0, s = size(in); i < s; ++i){const char c = in[i];const bool is_num = (c >= '0') && (c <= '9') || (c == '-');if (!is_num){continue;}else{char* off;result.push_back(strtol(&in[i], &off, 10));i += (off - &in[i]);}}sort(begin(result), end(result));out << '[';for (size_t i = 0, s = size(result); i < s; ++i) {if (0 != i)out << ',';out << result[i];}out << "]\n";}
}
#define main _
class Solution{
public:ListNode *mergeKLists(vector<ListNode *> &lists) { return nullptr; }
};

相关文章:

LeetCode Top100 Liked 题单(序号19~)

19. Remove Nth Node From End of List 题意&#xff1a;给一个链表&#xff0c;删除从尾数起的第n个结点&#xff0c;返回头节点。 我的思路 指针到最后&#xff0c;数出来有多少个&#xff0c;之从前向后数&#xff0c;再删掉节点 代码 10ms Beats 16.06% class Solution…...

qssh使用

到官网下载qssh的源码QSsh-botan-1&#xff0c;使用qtcreator打开后&#xff0c;直接编译&#xff0c;即可得到qssh的库 头文件将QSsh-botan-1\src\libs\ssh目录下的.h文件拷到include文件夹下&#xff0c;即为库头文件。 qssh有个问题&#xff0c;如果你将qssh的类放在子线程…...

持续部署CICD

目录 &#xff08;1&#xff09;CICD的开展场景 &#xff08;2&#xff09;项目实际应用 CICD 是持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;简称。指在研发过程中自动执行一系列脚本来降低开发引入 bug…...

ARM 循环阻塞延迟函数

串行驱动的关键是双方能够按照既定的时序进行检测、设置相关引脚上的电平&#xff0c;比如单总线、I2c这样基本的可以用GPIO模拟的时序协议&#xff0c;需要主从双方&#xff0c;必须在链路接口内严格按照微妙级的延迟单位进行时序同步。 所以&#xff0c;在这种对时间要求很敏…...

Spark的DataFrame和Schema详解和实战案例Demo

1、概念介绍 Spark是一个分布式计算框架&#xff0c;用于处理大规模数据处理任务。在Spark中&#xff0c;DataFrame是一种分布式的数据集合&#xff0c;类似于关系型数据库中的表格。DataFrame提供了一种更高级别的抽象&#xff0c;允许用户以声明式的方式处理数据&#xff0c…...

WPF线程使用详解:提升应用性能和响应能力

在WPF应用程序开发中&#xff0c;线程的合理使用是保证应用性能和响应能力的关键。WPF提供了多种线程处理方式&#xff0c;包括UI线程、后台线程、Task/Async Await和BackgroundWorker。这些方式与传统的Thread类相比&#xff0c;更加适用于WPF框架&#xff0c;并能够简化线程操…...

ava版知识付费平台免费搭建 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台

提供私有化部署&#xff0c;免费售后&#xff0c;专业技术指导&#xff0c;支持PC、APP、H5、小程序多终端同步&#xff0c;支持二次开发定制&#xff0c;源码交付。 Java版知识付费-轻松拥有知识付费平台 多种直播形式&#xff0c;全面满足直播场景需求 公开课、小班课、独…...

libuv库学习笔记-basics_of_libuv

Basics of libuv libuv强制使用异步和事件驱动的编程风格。它的核心工作是提供一个event-loop&#xff0c;还有基于I/O和其它事件通知的回调函数。libuv还提供了一些核心工具&#xff0c;例如定时器&#xff0c;非阻塞的网络支持&#xff0c;异步文件系统访问&#xff0c;子进…...

【Vuvuzela 声音去噪算法】基于流行的频谱减法技术的声音去噪算法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Vue + Element-ui组件上传图片报错问题解决方案

在前端开发中&#xff0c;我们经常需要模拟网络请求以进行单元测试或开发调试。而在模拟网络请求时&#xff0c;我们常常会使用到MockXMLHttpRequest对象。MockXMLHttpRequest对象是一个用于模拟XMLHttpRequest对象的工具&#xff0c;它提供了一种简单的方式来模拟网络请求&…...

java商城系统和php商城系统对比

java商城系统和php商城系统是两种常见的电子商务平台&#xff0c;它们都具有一定的优势和劣势。那么&#xff0c;java商城系统和php商城系统又有哪些差异呢&#xff1f; 一、开发难度 Java商城系统和PHP商城系统在开发难度方面存在一定的差异。Java商城系统需要使用Java语言进…...

某制造企业基于 KubeSphere 的云原生实践

背景介绍 随着业务升级改造与软件产品专案的增多&#xff0c;常规的物理机和虚拟机方式逐渐暴露出一些问题&#xff1a; 大量服务部署在虚拟机上&#xff0c;资源预估和硬件浪费较大&#xff1b;大量服务部署在虚拟机上&#xff0c;部署时间和难度较大&#xff0c;自动化程度…...

Electron 学习_BrowserWindow

BrowserWindow创建并控制浏览器窗口(主进程) 条件&#xff1a;在 app 模块 emitted ready 事件之前&#xff0c;您不能使用此模块。 1.在加载页面时&#xff0c;渲染进程第一次完成绘制时&#xff0c;如果窗口还没有被显示&#xff0c;渲染进程会发出 ready-to-show 事件 。 在…...

Docker学习笔记,包含docker安装、常用命令、dockerfile、docker-compose等等

&#x1f600;&#x1f600;&#x1f600;创作不易&#xff0c;各位看官点赞收藏. 文章目录 Docker 学习笔记1、容器2、Docker 安装3、Docker 常用命令4、Docker 镜像5、自定义镜像5.1、镜像推送到阿里云5.2、镜像私有库 6、数据卷7、Docker 软件安装8、Docker File8.1、常见保…...

解决 “Module build failed (from ./node_modules/babel-loader/lib/index.js)“ 错误的方法

系列文章目录 文章目录 系列文章目录前言一、错误原因&#xff1a;二、解决方法&#xff1a;三、注意事项&#xff1a;总结 前言 在前端项目开发中&#xff0c;如果使用了 Babel 来转译 ES6 语法&#xff0c;有时会遇到错误信息 “Module build failed (from ./node_modules/b…...

go学习 6、方法

6、方法 面向对象编程&#xff08;OOP&#xff09;&#xff0c;封装、组合。 6.1 方法声明 在函数声明时&#xff0c;在其名字之前放上一个变量&#xff0c;即是一个方法。这个附加的参数会将该函数附加到这种类型上&#xff0c;即相当于为这种类型定义了一个独占的方法。 …...

MySQL Windows版本下载及安装时默认路径的修改

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、MySQL 下载二、默认路径修改1、安装前准备【非常重要】2、启动安装程序总结1、MySQL下载2、MySQL默认路径修改前言 MySQL 被Oracle收购后,各种操作规范及约束也相应的跟着来了,这不,只…...

第3章 配置与服务

1 CoreCms.Net.Configuration.AppSettingsHelper using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration.Json; namespace CoreCms.Net.Configuration { /// <summary> /// 【应用设置助手--类】 /// <remarks> /// 摘要&#x…...

Arcgis之 KML/KMZ文件转shp

一般我们在Goole Earth上勾画的区域导出后都为KML或者KMZ格式的&#xff0c;但无法在arcgis等软件上直接应用&#xff0c;故需进行一定的转换 1.打开ArcMap&#xff0c;选择ArcToolbox->Conversion Tools->From KML->KML To Layer 得到如下结果&#xff08;由于本KML…...

python绘制3D条形图

文章目录 数据导入三维条形图bar3d 数据导入 尽管在matplotlib支持在一个坐标系中绘制多组条形图&#xff0c;效果如下 其中&#xff0c;蓝色表示中国&#xff0c;橘色表示美国&#xff0c;绿色表示欧盟。从这个图就可以非常直观地看出&#xff0c;三者自2018到2022年的GDP变化…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...