LeetCode刷题


一    螺旋矩阵

题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)

题目描述:

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

解题思路:

我们可以发现这个矩阵是由外围一层一层的包围,数值依次递增。观察发现如下规律:

 结合这个特点,我们可以用4个for循环来对没一条边赋值,当我们对一圈赋完值后,只要对起始和终止位置在修改即可。当n为偶数时,我们可以刚好循环完,当n为奇数时,我们会剩下一个格子。

如图:

所以当n为奇数时我们要进行一个单独赋值的操作。当我们进行赋值时,要统一操作,左开右闭的话每个边都要统一,我们这里就采用左开右闭,就是每条边的最后一个格子不赋值,放到下一条边处理。我们设起始点下标为star=0,循环次数为loop;那么第一次循环开始位置为a[star][star],终止为n-loop;第二次循环开始位置为a[star+1][star+1];终止位置为n-(loop+1),此时便完成了循环,最后加一个奇数单独赋值的情况即可。

我们这里就要考虑我们循环赋值要进行多少次?

归纳容易发现:

n=2      循环1次;

n=3      循环1次,单独赋值一个格子;

n=4      循环2次;

n=5      循环2次,单独赋值一个格子;

可以发现循环次数为n/2,当n为奇数是,取整数部分。

代码实现:

class Solution {public int[][] generateMatrix(int n) {int a[][]= new int[n][n];          //创建一个二维数组 int start=0;             //起始位置x,起始位置yint loop=0;                        //循环的次数 int count=1;                       //要进行赋值的数值,初始为1 int i,j;while(loop++<n/2){                 //当循环次数小于要循环的次数时,这里的loop也同时控制这终止下标for( j=start;j<n-loop;j++){    //第一条边:行不变,列递增a[start][j]=count++;}for( i=start;i<n-loop;i++){    //第二条边:列不变,行递增a[i][j]=count++;}for( ;j>start;j--){           //第三条边:行不变,列递减,这里j没初始化是因为,上一个for循环最终j的值就是此循环j的起始值a[i][j]=count++;         }for( ;i>start;i--){          //第四条边:列不变,行递减a[i][j]=count++;}start++;                       //改变下次循环起始位置}if(n%2==1){                         //如果n为奇数 a[n/2][n/2]=count;}return a;}
}

 

分析时间复杂度:

  • 外层的 while 循环执行的次数为 n/2 次,每次循环都会覆盖矩阵的一圈元素。
  • 内层的四个 for 循环的迭代次数依次为 n-1,n-1,n-1,n-2,分别表示四条边上的元素个数。
  • 因此,总体的时间复杂度为 O(n × n) = O(n²)。

分析空间复杂度:

  • 代码中创建了一个 n × n 的二维数组,因此占用的额外空间为 O(n²)。

综上所述,该代码的时间复杂度为 O(n²),空间复杂度为 O(n²)。



二    移除链表中的元素

题目链接:203. 移除链表元素 - 力扣(LeetCode)

题目描述:

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例 1:

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1
输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]

 

解题思路:

解题思路主要分为两种,一种是带虚拟头节点的,另一种是不带虚拟头节点的。

1.不带虚拟头节点的我们要考虑头节点为要删除的值的情况,和非头节点为要删除的的情况。头结点为要删除的值,只需要将头结点移动到下一个结点,让下一个结点为头结点即可。如图:

非头结点为要删除的值,则只需要找到该删除节点的前一个结点,让它直接连接删除结点的后一个结点即可。如图:

2.带虚拟头节点的只需要将所有节点当作非头结点处理即可。如图:


 

代码实现: 

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeElements(ListNode head, int val) {ListNode dumyhead=new ListNode(-1,head);//创建虚拟头结点ListNode per=dumyhead;   //per指针用来寻找要移除的元素while(per.next!=null){   //如果头结点不为空if(per.next.val==val){   //找到要删除的元素per.next=per.next.next;  //直接连接到删除结点的下一个结点}else{per=per.next;    //没找到指针后移}}return dumyhead.next;/**返回值为cur.net,cur是一个辅助节点,per是用来寻找的需要移除的节点*cur固定指向头节点*/}
}//   采用虚拟头结点的方法class Solution {public ListNode removeElements(ListNode head, int val) {while(head!=null&&head.val ==val){//如果头结点不为空并且头结点为要删除 的值head=head.next;             }ListNode cur=head;               //移动指针,查找非结点while(cur!=null&&cur.next!=null){if(cur.next.val==val){cur.next=cur.next.next;}else{cur=cur.next;}}return head;}
}//不用虚拟头结点的方法

复杂度分析:

  • 时间复杂度:遍历链表的过程中,需要检查所有的节点的值,并删除符合条件的节点。因此,代码的时间复杂度是 O(n),其中 n 是链表中的节点数。
  • 空间复杂度:代码只使用了常数级别的额外空间,所以空间复杂度是 O(1)。

所以两种方法的时间度均为均为O(n),空间复杂度均为O(1);



三   反转链表

 题目链接:206. 反转链表 - 力扣(LeetCode)​​​​​​

题目描述: 

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
 

示例 1:


输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]


示例 2:


输入:head = [1,2]
输出:[2,1]
示例 3:

输入:head = []
输出:[]

解题思路:

采用双指针的方法解题我们可以让一个指针在前,一个指针在后依次改变链表中的连接方向,动态效果如图:

代码实现:

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseList(ListNode head) {ListNode cur=head;ListNode per=null;while(cur!=null){ListNode temp=cur.next;//这里定义一个临时指针是因为,当我们将链接改变方向时,cur指针的下一个结点就失去了表达方式,所以我们要在改变之前提前存放好该结点。cur.next=per;per=cur;cur=temp;}return per;}
}

 

复杂度分析:

  • 时间复杂度:代码中的 while 循环会遍历整个链表,将每个节点的 next 指针改变指向前一个节点。因此,时间复杂度是 O(n),其中 n 是链表的节点数。
  • 空间复杂度:代码只使用了常数级别的额外空间,所以空间复杂度是 O(1)。

综上所述,该代码的时间复杂度是 O(n),空间复杂度是 O(1)。



四   两两交换链表中的节点

题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode)

题目描述:

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:


输入:head = [1,2,3,4]
输出:[2,1,4,3]


示例 2:

输入:head = []
输出:[]


示例 3:

输入:head = [1]
输出:[1]

解题思路:

使用虚拟头节点。先定义一个指针,指针每次指向即将操作的节点(1,2)的前一个节点,然后指针指向的节点的下一个节点连接到节点2,在将节点2,连接到节点1,要注意一旦指针指向的节点连接到节点2以后,节点1就失去了表达式,所以节点1要提前存放,同理节点2连接到节点1以后节点3也就失去了表达式,节点3也要提前处理。如图:

代码实现:

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode swapPairs(ListNode head) {ListNode dumyhead = new ListNode(-1);//定义一个虚拟头节点dumyhead.next=head;ListNode cur=dumyhead;//定义一个移动指针,每次指向要修改的节点的前一个节点while(cur.next!=null && cur.next.next!=null){ListNode temp,temp1;/*定义两个临时指针,都指向要修改的节点的第一个节点,*temp指向前两个的第一个,temp2指向修改的后两个的第一个**/temp=cur.next;//节点1为temptemp1=cur.next.next.next;//节点3为temp1,这里做处理是因为一旦节点2的下一个链接节点1,便会与节点3断开cur.next=cur.next.next;//虚拟头节点的下一个节点为节点2;cur.next.next=temp;//链接节点1temp.next=temp1;//链接节点3cur=cur.next.next;//修改cur到未改变的节点的前一个}  return dumyhead.next;}
}

 

复杂度分析

  • 时间复杂度:代码中的 while 循环会遍历链表,并在每次循环中交换两个节点。因此,时间复杂度是 O(n),其中 n 是链表的节点数。
  • 空间复杂度:代码只使用了常数级别的额外空间,所以空间复杂度是 O(1)。

 



参考资料:

代码随想录_百度搜索 (baidu.com)

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

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

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

相关文章

【论文阅读 08】Adaptive Anomaly Detection within Near-regular Milling Textures

2013年&#xff0c;太老了&#xff0c;先不看 比较老的一篇论文&#xff0c;近规则铣削纹理中的自适应异常检测 1 Abstract 在钢质量控制中的应用&#xff0c;我们提出了图像处理算法&#xff0c;用于无监督地检测隐藏在全局铣削模式内的异常。因此&#xff0c;我们考虑了基于…

如何正确使用MySQL的索引呢?

前言: 📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年! 📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。 😇😇😇有兴趣的话关注博主一起学习,一起进步吧! 一、索引使用…

探索创意的新辅助,AI与作家的完美合作

在现代社会&#xff0c;文学创作一直是人类精神活动中的重要一环。从古典文学到现代小说&#xff0c;从诗歌到戏剧&#xff0c;作家们以他们的独特视角和文学天赋为我们展示了丰富多彩的人生世界。而近年来&#xff0c;人工智能技术的快速发展已经渗透到各行各业&#xff0c;文…

【数据结构】二叉树的销毁 二叉树系列所有源代码(终章)

目录 一&#xff0c;二叉树的销毁 二&#xff0c;二叉树系列所有源代码 BTee.h BTee.c Queue.h Queue.c 一&#xff0c;二叉树的销毁 二叉树建好了&#xff0c;利用完了&#xff0c;也该把申请的动态内存空间给释放了&#xff0c;那要如何释放呢&#xff1f; 我们还是以…

LeetCode力扣020:有效的括号

有效的括号 实现思路 设立判定条件遍历的范围 代码实现 class Solution(object):def isValid(self, s):""":type s: str:rtype: bool"""nlen(s)for i in range(0,n-1):if s[i]( and s[i1]!):return Falseif s[i][ and s[i1]!]:return Falseif s…

02Redis的命令行客户端和桌面客户端的下载和安装

Redis桌面客户端 安装完成Redis服务,我们就可以在Redis的客户端操作Redis的数据库实现数据的CRUD了,客户端分为三类命令行客户端, 图形化桌面客户端,编程客户端 命令行客户端 Redis安装完成后就自带了命令行客户端: redis-cli [options] [commonds] -h选项&#xff1a;指定…

Jenkins+Allure+Pytest的持续集成

一、配置 allure 环境变量 1、下载 allure是一个命令行工具&#xff0c;可以去 github 下载最新版&#xff1a;https://github.com/allure-framework/allure2/releases 2、解压到本地 3、配置环境变量 复制路径如&#xff1a;F:\allure-2.13.7\bin 环境变量、Path、添加 F:\a…

从零开始的 MyBatis 拦截器之旅:实战经验分享

文章目录 MyBatis拦截器可以做什么&#xff1f;Mybatis核心对象介绍四大核心对象如何实现&#xff1f;接口讲解Interceptor接口intercept方法plugin方法setProperties 完整SQL打印拦截器实战拦截器实现拦截器注册 MyBatis拦截器可以做什么&#xff1f; MyBatis拦截器是MyBatis…

软件测试面试题 —— 整理与解析(4)

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

自动化测试:为什么需要框架

前两天跟老板出去做pre-sales. 主要是去卖我们的自动化测试服务&#xff0c;工具用的是HP UFT。做过自动化的人应该知道&#xff0c;UFT在自动化测试领域已经算是最好的工具之一了。客户是个有技术背景的人&#xff0c;所以不那么好忽悠。我们准备了一大堆自动化测试优点的幻灯…

推荐一个AI人工智能技术网站(一键收藏,应有尽有)

1、Mental AI MentalAI&#xff08;https://ai.ciyundata.com/&#xff09;是一种基于星火大模型和文心大模型的知识增强大语言模型&#xff0c;专注于自然语言处理&#xff08;NLP&#xff09;领域的技术研发。 它具备强大的语义理解和生成能力&#xff0c;能够处理各种复杂的…

【效率提升】maven 转 gradle 实战 | 京东云技术团队

一、灵魂三问 1、gradle 是什么&#xff1f; 一个打包工具&#xff0c; 是一个开源构建自动化工具&#xff0c;足够灵活&#xff0c;可以构建几乎任何类型的软件&#xff0c;高性能、可扩展、能洞察等。其中洞察&#xff0c;可以用于分析构建过程中数据&#xff0c;提供分析参…

想学python找不到合适的书籍?它来了!入门python只需要这一本书就够了!

想学python找不到合适的书籍&#xff1f;看了视频还是不知如何下手&#xff1f; 《python王者归来》 它来了&#xff01;由清华大学出版社出版&#xff01;入门python只需要这一本书就够了&#xff01; 【PDF版领取见文末】 这是一本python入门书。无论你是计算机专业的大学生…

C语言之字符函数字符串函数篇(1)

目录 前言 求字符串长度 strlen strlen统计的是字符串\0之前的字符串长度 字符指针 strlen的返回值是无符号整型 strlen的三种模拟实现 计数器 函数递归 指针_指针 长度不受限制的字符串函数 strcpy strcpy会将源字符串中的 \0 拷贝到目标空间 strcpy参数目标空…

echarts添加点击事件

实现效果&#xff1a;点击图表&#xff0c;弹出该数据下对应得详情 官方文档&#xff1a; 封装的图表组件中&#xff1a; 点击获取点击得对象&#xff0c;进而将需要的参数传给父组件&#xff0c;在父组件中再去请求接口获取更多信息 this.chart.on(click, (params)> {th…

Docker 安装Redis(集群)

3主3从redis集群配置 1、新建6个docker容器 redis 实例 docker run -d --name redis-node-1 --net host --privilegedtrue -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381 docker run -d --name redis-node-2 --ne…

聚焦云原生安全|如何为5G边缘云和工业互联网应用筑牢安全防线

9月22日&#xff0c;2023年中国信息通信业发展高层论坛5G工业互联网分论坛在北京顺利举办。 作为国内云原生安全领导厂商&#xff0c;安全狗受邀出席此次活动。 据悉&#xff0c;中国信息通信业发展高层论坛是致力于研究信息通信业发展新问题、新趋势&#xff0c;推动信息通信…

使用vite插件进行低代码平台自定义开发(手机版自定义范例)

前言 Youtube上的前端网红「Theo」在React文档仓库发起了一个Pull request&#xff0c;号召React文档不要再默认推荐CRA(create react app)&#xff0c;而是应该将Vite作为构建应用的首选。 vite的影响力已经从vue蔓延到了react&#xff0c;可见在前端工程化开发中&#xff0c…

如何使用ArcGIS Pro将等高线转DEM

通常情况下&#xff0c;我们拿到的等高线数据一般都是CAD格式&#xff0c;如果要制作三维地形模型&#xff0c;使用栅格格式的DEM数据是更好的选择&#xff0c;这里就为大家介绍一下如何使用ArcGIS Pro将等高线转DEM&#xff0c;希望能对你有所帮助。 创建TIN 在工具箱中选择“…