LeetCode刷题——hot 100(3)

题目1:矩阵置零

题目:

问题分析:使用两个布尔数组来分别记录哪行哪列出现了0,当出现0的行和列,对应的布尔数组值置为true。再次遍历数组,当出现行数组和列数组中的值为true,则对应的原数组的值置为0.

代码:

class Solution {public void setZeroes(int[][] matrix) {int m=matrix.length;//记录数组的行数int n=matrix[0].length;//记录数组的列数boolean[] row=new boolean[m];boolean[] col=new boolean[n];for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(matrix[i][j]==0){row[i]=col[j]=true;}}}for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(row[i]||col[j]) matrix[i][j]=0;}}}
}

时间复杂度:O(mn).

题目2:螺旋矩阵

题目:

问题分析:用数组记录四个方向,用「行偏移量,列偏移量」描述 4 个方向,directions的四个元素分别表示右 下 左 上四个方向,用directionIndex来访问方向数组中的四个方向,是directions数组的索引,当遇到已访问的数组元素或是边界的时候,就更改访问的方向为下一个方向。

代码:

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> result=new ArrayList<>();int rows=matrix.length;//总共的行数int columns=matrix[0].length;//总共的列数boolean[][] visited=new boolean[rows][columns];if(matrix==null||rows==0||columns==0){return result;}int row=0;//当前行int column=0;//当前列int[][] directions={{0,1},{1,0},{0,-1},{-1,0}};//分别表示右 下 左 上四个方向int directionIndex=0;//当前的方向索引,对上上面的数组directions的四个方向for(int i=0;i<rows*columns;i++){result.add(matrix[row][column]);visited[row][column]=true;int nextRow=row+directions[directionIndex][0];int nextColumn=column+directions[directionIndex][1];if(nextRow<0||nextRow>=rows||nextColumn<0||nextColumn>=columns||visited[nextRow][nextColumn]){directionIndex=(directionIndex+1)%4;//越界或是遇到已访问的元素,方向换一个}row=row+directions[directionIndex][0];column=column+directions[directionIndex][1];}return result;}
}

时间复杂度:O(N).

题目3:旋转图像

题目:

问题分析:使用翻转操作代替旋转操作,先将数组以水平轴翻转,再将数组根据对角线翻转。水平翻转只翻转上半部分,所以i<n/2,对角线翻转只翻转一半的对角线,所以j<i.

代码:

class Solution {public void rotate(int[][] matrix) {int n=matrix.length;for(int i=0;i<n/2;i++){//只翻转上半部分for(int j=0;j<n;j++){int temp=matrix[i][j];matrix[i][j]=matrix[n-i-1][j];//水平翻转,行变列不变matrix[n-i-1][j]=temp;}}for(int i=0;i<n;i++){for(int j=0;j<i;j++){int temp=matrix[i][j];matrix[i][j]=matrix[j][i];//对角线翻转,行列互换matrix[j][i]=temp;}}}
}

时间复杂度:O(N^2).

题目4:搜索二维矩阵II

题目:


问题分析:从右上角开始查找,若当前元素大于target,则说明当前元素所在列都不可能找到target,因为数组从上到下升序排列,则往前一列继续查找;若当前元素小于target,则说明当前元素所在行都不可能找到target,因为数组从左到右升序排列,则往下一行继续查找。

代码:

class Solution {public boolean searchMatrix(int[][] matrix, int target) {int i=0;int j=matrix[0].length-1;//右上角的数组下标while(i<matrix.length&&j>=0){if(matrix[i][j]==target) return true;//找到则返回trueelse if(matrix[i][j]>target){j--;}else{i++;}}return false;}
}

时间复杂度:O(M+N).

题目5:相交链表

题目:

问题分析:

代码:

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode p=headA;ListNode q=headB;while(p!=q){//p不等于q的时候才循环,p=q则证明要么到相交节点了,要么没有相交节点,到空节点了p=p!=null?p.next:headB;q=q!=null?q.next:headA;}return p;}
}

代码比较两个节点的时候,比较的是内存地址是否一致,两个链表相交,其相交节点的内存地址一定一致。

时间复杂度:O(M+N).

题目6:环形链表

题目:

问题分析:使用快慢指针来求解,快慢指针同时从头结点出发,快指针每次走两步,慢指针每次走一步,若是两者相遇,这则证明链表中一定存在环。因为快指针相对于慢指针走一步,所以若有环,快指针一定会追上慢指针。

代码:

public class Solution {public boolean hasCycle(ListNode head) {ListNode fast=head;ListNode slow=head;while(fast!=null&&fast.next!=null){//因为快指针每次走两步,得同时满足fast和fast.next都不为null的情况下,才能成功的走完两步slow=slow.next;fast=fast.next.next;if(slow==fast){return true;}}return false;}
}

时间复杂度:O(N).

题目7:反转链表

题目:

问题分析:使用迭代的头插法来解决这道题目,例如链表1->2->3,使用头插法,就是把新建一个空链表,依次把1,2,3插到这个新链表的头部,就得到链表3->2->1,这就是反转后的链表。

代码:

class Solution {public ListNode reverseList(ListNode head) {if(head==null||head.next==null){return head;}ListNode pre=null;ListNode cur=head;while(cur!=null){ListNode next=cur.next;cur.next=pre;pre=cur;cur=next;//不断地迭代,直至跳出while循环}return pre;}
}

时间复杂度:O(N).

题目8:回文链表

题目:

问题分析:首先找到链表的中间节点,若是原链表有奇数个节点,则是最中间一个,例如1->2->3,这个链表的中间节点是2;若是原链表有偶数个节点,则是中间偏右的那个节点,5->3->4->1,这个链表的中间节点是4。然后把中间节点之后的链表进行反转,再依次比较反转后的链表的各个节点与原链表前半部分节点的值。例如,原链表为6->4->5->4->6,中间的节点为5,反转后的链表为head2: 6->4,之前的链表head: 6->4->5,比较各个节点的值。

代码:

class Solution {public boolean isPalindrome(ListNode head) {ListNode mid=middleNode(head);ListNode head2=reverse(mid);while(head2!=null){if(head.val!=head2.val) return false;head=head.next;head2=head2.next;}return true;}private ListNode middleNode(ListNode head){ListNode slow=head;ListNode fast=head;while(fast!=null&&fast.next!=null){slow=slow.next;fast=fast.next.next;}return slow;}private ListNode reverse(ListNode head){ListNode pre=null;ListNode cur=head;while(cur!=null){ListNode next=cur.next;cur.next=pre;pre=cur;cur=next;}return pre;}
}

时间复杂度:O(N).

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

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

相关文章

Ajax-day2(图书管理)-渲染列表

本篇笔记素材来自“黑马程序员” 渲染列表图书管理一、获取数据二、渲染数据完整代码图书管理 Bootstrap 框架渲染列表&#xff08;查&#xff09;新增图书&#xff08;增&#xff09;删除图书&#xff08;删&#xff09;编辑图书&#xff08;改&#xff09; 自己的图书数据&a…

MOS管的电路

MOS管的三极都会存在以下三个电容&#xff0c;分别是&#xff1a;Cgs,Cgd,Cds 输入电容CissCgsCgd 输出电容CossCgdCds 反向传输电容CrssCgd&#xff0c;也叫米勒电容 然而&#xff0c;这三个等效电容是构成串并联组合关系&#xff0c;他们并不是独立的&#xff0c;而是相互…

STM32_05_时钟树

时钟 d用来输入数据&#xff0c;CLK就是我们的时钟&#xff0c;CPU1s中72000000HZ个时钟周期STM32的时钟树锁相环HSE时钟源HSI时钟源LSE时钟源LSI时钟源SystemInit函数SetSysClock函数SetSysClockTo72函数SystemInit()后时钟频率大小总结RCC标准库函数定义变量a&…

C语言---判断语句

文章目录1. if 语句2. if...else 语句3. if...else if...else 语句4. switch 语句5. 三元运算符 ( ? : )总结与对比如何选择C语言中的判断语句用于根据给定的条件来决定执行哪一段代码。其核心是条件为真&#xff08;必须&#xff09;则执行一段代码&#xff0c;条件为假&…

[硬件电路-212]:电流的本质确实是电子的移动

1. 微观机制&#xff1a;电子的定向漂移与热运动定向漂移&#xff08;Drift Motion&#xff09;&#xff1a;在导体&#xff08;如金属&#xff09;中&#xff0c;自由电子&#xff08;价电子&#xff09;受电场驱动&#xff0c;从负端向正端定向移动&#xff0c;形成宏观电流。…

双RFSOC47DR-16通道5GSPS ADC采集模块

16通道5GSPS ADC采集板卡组成如图1所示。该板卡的输入接口为SMA单端输入&#xff0c;ADC采集和处理采用Xilinx公司的XCZU47DR-2FFVE1156I芯片。板卡需配备4路QSFP28光口输出&#xff0c;并需要集成网口、DDR4、SD卡、USB调试口。两块RF-Soc需确保连接通信功能。板卡的16通道需实…

pytest -- 中文文档

前言 零基础1小时快速入门pytest自动化测试教程&#xff0c;全套项目框架实战pytest配置文件可以改变pytest的运行方式&#xff0c;它是一个固定的文件pytest.ini文件&#xff0c;读取配置信息&#xff0c;按指定的方式去运行 非test文件 pytest里面有些文件是非test文件 pyt…

硬件开发2-ARM裸机开发3-IMX6ULL - 引入中断

一、铺垫引入中断 → 按键1、概要&#xff1a;实现按键控制发光二极管和蜂鸣器输入类型的外设&#xff1a;按键&#xff08;key&#xff09;2、参考手册内容完成配置过程&#xff08;1&#xff09;key 按键原理图&#xff08;2&#xff09;core 内核中命名 -- UART1 CTS&#x…

Ansible的 Playbook 模式详解

目录一、Playbook模式1.1 Playbook 的优势1.2 Playbook 的组成1.3 安装 httpd 服务案例1.4 Playbook 命令及常用参数1.5 Playbook 的语法 —— 权限相关1. remote_user2. become3. become_method1.6 Playbook 的通知与触发机制1. notify2. handlers3. 使用示例4. 使用场景1.6 P…

猿辅导Java后台开发面试题及参考答案

int 与 Integer 的区别是什么&#xff1f;若创建数量庞大的数字时使用 Integer&#xff0c;会对重复数字创建新对象吗&#xff1f;int 是 Java 中的基本数据类型&#xff0c;直接存储数值&#xff0c;占用 4 个字节&#xff0c;默认值为 0&#xff0c;不需要通过 new 关键字创建…

代码随想录学习摘抄day9(回溯1-11)

一个朴实无华的目录定义&#xff1a;回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。应用场景&#xff1a;回溯法解决的问题都可以抽象为树形结构代码模板题型第77题. 组合思路&#xff1a;每次从集合中选取元素&#xff0c;可选择的范围随着选择的进行而收缩&…

Altium Designer(AD24)打开工程文件的几种方法

🏡《专栏目录》 目录 1,概述 2,源文件 2,菜单栏 4,工具栏 5,注意事项 1,概述 本文介绍几种打开工程文件的方法。 2,源文件 找到工程的源文件存储路径,找到.PrjPcb的源工程文件,双击打开。 2,菜单栏 第1步:执行File→Open, 第2步:找到工程文件的存储路径,并选中…

Linux嵌入式自学笔记(基于野火EBF6ULL):2.点灯与ubuntu安装

一、点灯登录root&#xff1a;账号&#xff1a;root ; 密码&#xff1a;root点灯命令&#xff1a;echo 0 > /sys/class/leds/red/brightness #关闭red灯 echo 0 > /sys/class/leds/blue/brightness #关闭blue灯 echo 0 > /sys/class/leds/green/brightness …

【Java实战㊷】Java实战:MyBatis-Plus 开启MySQL数据库高效操作之旅

目录 一、MyBatis-Plus 环境集成 1.1 项目依赖引入 1.2 数据库配置 1.3 代码生成器使用 二、核心 CRUD 操作实现 2.1 基础查询 2.2 数据新增与修改 2.3 复杂查询场景 三、性能优化与高级特性 3.1 缓存配置 3.2 乐观锁实现 3.3 字段自动填充 四、实战案例:用户管理模块开发 4.1…

开学季干货——知识梳理与经验分享

技术文章大纲&#xff1a;开学季干货——知识梳理与经验分享目标受众分析明确文章面向的学生群体&#xff08;如大学生、高中生&#xff09; 分析不同群体的核心需求&#xff08;课程准备、时间管理、工具使用&#xff09; 结合技术场景&#xff08;如数字笔记、在线协作&#…

Linux《线程(上)》

通过之前的学习我们已经了解了操作系统当中的基本的概念包括进程、基础IO、磁盘文件存储等&#xff0c;但是到目前为止我们还未了解到线程相关的概念&#xff0c;这就使得当前我们对操作系统的认知还不是完整的&#xff0c;现在我们是还是无法理解一个进程当中是如何同时的执行…

为什么知识复用时缺乏场景化指导影响实用性

知识复用时因缺乏场景化指导而严重影响实用性&#xff0c;其根本原因在于知识的价值本质上根植于其应用情境。脱离了场景的“纯知识”往往是抽象、片面且难以行动的。这导致了认知鸿沟的产生、隐性知识的流失、决策风险的增加、以及学习迁移效率的低下。当使用者面对一份缺乏“…

拥抱直觉与创造力:走进VibeCoding的新世界

引言 在传统观念里&#xff0c;编程是一项高度理性、逻辑严密的活动&#xff0c;开发者需要像建筑师一样&#xff0c;用代码一行行地精确构建数字世界。然而&#xff0c;随着人工智能技术的飞速发展&#xff0c;一种全新的编程理念和体验正在兴起——它就是 VibeCoding&#xf…

HTTP的Web服务测试在Python中的实现

在Web开发领域&#xff0c;对HTTP Web服务进行测试是确保服务稳定性和可靠性的关键步骤。Python作为一种功能强大的编程语言&#xff0c;提供了多种工具和库来简化这一过程。本文将介绍如何在Python中实现HTTP的Web服务测试。首先&#xff0c;Python的requests库是测试HTTP Web…

Android Studio 构建项目时 Gradle 下载失败的解决方案

一、问题原因分析根据错误日志&#xff1a;下载地址 https://services.gradle.org/distributions/gradle-8.1-bin.zip 连接超时&#xff08;10秒&#xff09;。可能原因&#xff1a;网络环境限制&#xff08;如公司防火墙、地区网络屏蔽&#xff09;。代理配置未生效或配置错误…