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.mzph.cn/news/88191.shtml

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

相关文章

算法基础之归并排序

一、归并排序的形象理解 原题链接 示例代码 void merge_sort(int q[], int l, int r) {if (l > r) return;int mid l r >> 1;merge_sort(q, l, mid), merge_sort(q, mid 1, r);int k 0, i l, j mid 1;while (i < mid && j < r) //第一处if (q[i]…

计算机类软件方向适合参加的比赛

前言 博主是一名计算机专业的大三学生&#xff0c;在校时候参加了很多比赛和训练营&#xff0c;现在给大家博主参加过的几个的比赛&#xff0c;希望能给大一大二的学生提供一点建议。 正文 最近也有比赛的&#xff0c;我会从时间线上来给大家推荐一些比赛&#xff0c;并且给…

C/C++程序,从命令行传入参数

C/C中如何让程序接受并处理命令行参数_c 命令行接收--version_饼干叔叔海洋的博客-CSDN博客 #include <stdio.h> #include <stdlib.h>//argc&#xff1a;argument count //argv: arguments vector,参数向量。 //33 777 103 int main(int argc, char **argv){ //…

工地临时用电之智慧用电:全方位保障用电安全

随着科技进步和智能化的发展&#xff0c;工地用电管理也迎来了智慧化的革新。智慧用电&#xff0c;作为智慧工地的重要组成部分&#xff0c;通过集中式管理和创新的技术手段&#xff0c;为工地提供了全方位的用电安全保障。 针对工地临时用 的现状及系统结构&#xff0c;力安科…

Docker 部署前端项目(非自动化)

部署前端项目 1. nginx配置文件1.1 nginxConf 2. 创建容器2.1 添加项目2.2 下载项目依赖2.3 打包前端项目2.4 创建容器2.5 查看容器 3. 视频演示4. 注意 1. nginx配置文件 1.1 nginxConf 首先你需要有nginx配置文件&#xff0c;你可以执行以下命令获取配置文件 # 安装镜像-生成…

babel的配置执行顺序

babel配置文件&#xff1a; //.babelrc {"presets": ["babel/preset-env","babel/preset-react"],"plugins": ["babel/plugin-proposal-class-properties",["babel/plugin-transform-runtime",{"corejs&quo…

计算机专业毕业设计项目推荐09-个人医疗系统(Spring+Js+Mysql)

个人医疗系统&#xff08;SpringJsMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及…

智慧公厕自动化保洁系统,让公共厕所实现7*24 持续整洁

随着科技的不断进步&#xff0c;越来越多的创新方案应用于各个领域&#xff0c;公共厕所的智慧化也不例外。本文重点介绍智慧公厕源头厂家广州中期科技有限公司&#xff0c;大量案例项目中所使用的智慧公厕自动化保洁系统&#xff0c;能有效地节省人力&#xff0c;并保持公共厕…

网络安全,weblogic漏洞复现

WebLogic是美国Oracle公司出品的一个Java应用服务器&#xff0c;是一个基于JAVAEE架构的中间件&#xff0c;用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用。 2|0弱口令登陆部署shell文件 App Weblogic Path weblogic/weak_password 2|1介绍 用户管理…

广东电信和中兴开通首个50G PON万兆入企啦!

最近广东电信和中兴在深圳市南山科技园成功开通了首个50G PON万兆入企应用&#xff0c;双方将携手打造50G PON万兆入企的示范应用样板工程和产业园区&#xff0c;看来“万兆入企&#xff0c;助力深圳打造全球数字先锋城市”的目标是指日可待了。 深圳在2022年发布了《深圳市推进…

数据库管理工具DBeaverUltimate mac中文高级功能

DBeaver Ultimate mac是一款数据库管理工具&#xff0c;支持多种数据库&#xff0c;包括MySQL、Oracle、PostgreSQL、SQLite、Microsoft SQL Server等。它提供了一个直观的用户界面&#xff0c;使用户可以轻松地管理和查询数据库&#xff0c;包括创建和修改表、执行SQL查询、导…

面试官的几句话,差点让我挂在HTTPS上

♥ 前 言 作为软件测试&#xff0c;大家都知道一些常用的网络协议是我们必须要了解和掌握的&#xff0c;比如 HTTP 协议&#xff0c;HTTPS 协议就是两个使用非常广泛的协议&#xff0c;所以也是面试官问的面试的时候问的比较多的两个协议&#xff1b;而且因为这两个协议有相…

如何使用php提取文章中的关键词?PHP使用Analysis中英文分词提取关键词

1、下载Analysis&#xff0c;创建test.php测试 2、引入Analysis实现中文分词 <?php include "./Analysis/Analysis.php";$annew \WordAnalysis\Analysis(); $content"机器学习是一门重要的技术&#xff0c;可以用于数据分析和模式识别。"; //10分词数…

Goby 漏洞发布|Revive Adserver 广告管理系统 adxmlrpc.php 文件远程代码执行漏洞(CVE-2019-5434)

漏洞名称&#xff1a;Revive Adserver 广告管理系统 adxmlrpc.php 文件远程代码执行漏洞&#xff08;CVE-2019-5434&#xff09; English Name&#xff1a; Revive Adserver adxmlrpc.php Remote Code Execution Vulnerability (CVE-2019-5434) CVSS core: 9.0 影响资产数&a…

配置pytorchGPU虚拟环境-python3.7

cuda版本的pytorch包下载地址戳这里 winR->输入cmd->输nvcc -V回车 cuda 11.0 输入以下命令来查找 CUDA 的安装路径&#xff1a; Windows: where nvcc 输入以下命令来查找 cuDNN 的版本号&#xff1a; Windows: where cudnn* cuDNN 8.0 本机安装的是cuda 11.0&…

MySQL - 关于约束类型和作用的介绍

约束的概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 约束的作用&#xff1a;用于保证数据库中数据的正确性、完整性和一致性。 约束分类&#xff1a; 约束类型作用关键字非空约束限制该字段的数据不能为nullnot null唯一约束保证该…

【深度学习-第3篇】使用MATLAB快速实现CNN分类(模式识别)任务,含一维、二维、三维数据演示案例

在本文中&#xff0c;我们将介绍如何使用 MATLAB 中的 Convolutional Neural Network&#xff08;CNN&#xff09;进行分类任务。我们将使用 MATLAB 的 Deep Learning Toolbox 来创建、训练和评估 CNN。 一、一个简单的案例 1 安装和准备 首先&#xff0c;确保已安装 MATLAB…

基于SSM的高校图书馆个性化服务的设计与实现(有报告)。Javaee项目。

演示视频&#xff1a; 基于SSM的高校图书馆个性化服务的设计与实现&#xff08;有报告&#xff09;。Javaee项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过S…

HarmonyOS 4.0 实况窗上线!支付宝实现医疗场景智能提醒

本文转载自支付宝体验科技&#xff0c;作者是蚂蚁集团客户端工程师博欢&#xff0c;介绍了支付宝如何基于 HarmonyOS 4.0 实况窗实现医疗场景履约智能提醒。 1.话题背景 8 月 4 日&#xff0c;华为在 HDC&#xff08;华为 2023 开发者大会&#xff09;上推出了新版本操作系统…

003:如何画出成交量的柱状图

接着《002&#xff1a;如何画出收盘价的曲线图》&#xff0c;继续画成交量柱状图。 import pandas as pd import matplotlib.pyplot as plt# 读取CSV文件&#xff0c;指定逗号作为分隔符 data pd.read_csv(002885.csv, sep,)# 提取成交量和日期数据 volume data[成交量] dat…