- 博客(90)
- 问答 (1)
- 收藏
- 关注
原创 LeetCode:22.相交链表
假设链表 headA 的不相交部分有 a 个节点,链表 headB 的不相交部分有 b 个节点,两个链表相交的部分有 c 个节点,则有 a+c=m,b+c=n。当链表 headA 和 headB 都不为空时,创建两个指针 pA 和 pB,初始时分别指向两个链表的头节点 headA 和 headB,然后将两个指针依次遍历两个链表的每个节点。因此首先判断链表 headA 和 headB 是否为空,如果其中至少有一个链表为空,则两个链表一定不相交,返回 null。情况二:两个链表不相交。情况一:两个链表相交。
2025-09-19 15:20:30
437
原创 LeetCode:21.搜索二维矩阵Ⅱ
对于第一种方法我们是否可以进行优化,这个二维矩阵每行从左到右,每列从上到下升序,可以利用这一特性,从右上角第一个元素开始判断,如果大于目标值,因为这个元素是这一行的最大元素了,应当去前面继续查找,同理,小于目标值,去下一行查找。通过这样判断,我们可以一次排除掉一行或一列的元素,相比于两次遍历,时间复杂度有所提升。对于在一个二维矩阵中查找元素是否存在,我们首先会想到暴力枚举,通过两次遍历可以找出。
2025-09-19 14:57:56
151
原创 LeetCode:19.螺旋矩阵
这道题可以通过用4个变量up,down,left,right来控制边界进行遍历,up表示矩阵的最上一行,down表示最下面一行,left表示最左边一列,right表示最右边一列,所以就可以得到以下的图。我们就可以从上面开始遍历,从left移动到right,到right之后++up移动到下一层,如果大于down的话就break,其他的同理。
2025-09-18 23:45:43
92
原创 LeetCode:18.矩阵置零
这道题可以通过用两个标记数组来分别表示这一行和这一列是否存在0,我们先遍历整个数组,如果遇到一个位置为0的话,就将其所在的行和列置为true,遍历完成后标记数组内就存放了每一行每一列是否有0,之后遍历,如果遇到true的位置,置为0即可。
2025-09-18 23:23:23
106
原创 LeetCode:17.缺失的第一个正数
由于数组中的数没有任何限制,因此这并不是一件容易的事情。但我们可以继续利用上面的提到的性质:由于我们只在意 [1,N] 中的数,因此我们可以先对数组进行遍历,把不在 [1,N] 范围内的数修改成任意一个大于 N 的数(例如 N+1)。我们对数组进行遍历,对于遍历到的数 x,如果它在 [1,N] 的范围内,那么就将数组中的第 x−1 个位置(注意:数组下标从 0 开始)打上「标记」。在遍历结束之后,如果所有的位置都被打上了标记,那么答案是 N+1,否则答案是最小的没有打上标记的位置加 1。
2025-09-18 23:11:57
148
原创 LeetCode:16.除自身以外数组的乘积
具体如何表示 f[i] 和 g[i]的通式, f[i] 为 [0, i - 1] 的前缀积,所以 f[i - 1] 表示[0, i - 2]的前缀积,在乘以 nums[i - 1] 的值就可以表示 f[i], g[i]也是同理。通过同时可以看出f应该从左到右填写,g应该从右到左填写,同时 f[0] 和g[n - 1]这两个边界值应当为1,如果填写为0,表中的所有数据都为0。f[i]: [0, i - 1]的前缀积,g[i] = [i + 1, n - 1]的后缀积。
2025-09-18 10:46:35
149
原创 LeetCode:15.转轮数组
通过例子可以看出nums[0]对应旋转后3的下标,通过观察可以看出其中坐标的对应关系为nums[i] = copy[(i + k) % n],所以这道题可以用一个copy数组来保存转轮后的数据,再将copy数组赋值给nums。
2025-09-18 10:31:29
50
原创 LeetCode:14.合并区间
所以这道题的具体思路为:先对原数组进行排序,便于合并,同时遍历数组取到左端点和右端点,如果结果数组为空,或者结果数组的右端点小于原数组的左端点,说明不能合并,直接插入即可,否则在结果数组右端点和原数组右端点中取出较大的一个更新边界。对于这个原数组来说,我们并不知道这个区间可以和哪一个区间合并,可能是下一个,也可能是中间任意一个,所以为了方便思考,我们可以将原数组进行排序,这样,如果当前区间不能和下一个合并,就可以肯定它不能合并了。
2025-09-18 00:21:40
295
原创 LeetCode:13.最大子数组和
因为dp用到了前一个位置的值,所以我们从左向右填写dp表,同时为了方便计算,可以多开一个空间,以便于计算第一个位置,因为多开了一个空间,nums[i]的映射关系就发生了变化,需要-1。这道题通过动态规划的思想来解决,我们首先设状态方程dp[i]表示以i位置为结尾的所有子数组中的最大和。所以我们的dp[i] = max(nums[i], dp[i - 1] + nums[i])
2025-09-17 22:50:44
135
原创 LeetCode:12.最小覆盖字串
这道题和第9题找到字符串中所有的字母异位词的思想基本一致,只不过在其中添加了统计字符串t中字符的种类,与第9题不同的是当s和t中字符出现的次数相等时,我们才认为这是一个有效字符,而不是个数小于等于t就认为有效,当count等于kinds的时候这就是一个有效字符,我们将其与INT_MAX比较取出最小的长度,若是当前的长度大于minlen,就收缩left,去下一个区间寻找最小的长度。
2025-09-17 22:32:32
272
原创 LeetCode:10.和为K的子数组
sum - k 的意义:这个检查的意义在于,如果 sum - k 存在于 Map 中,说明之前在某个点的累积和是 sum - k。首先,我们使用一个叫做“前缀和”的概念。如何使用这个信息:如果 sum - k 在 Map 中,那么 sum - k 出现的次数表示从不同的起始点到当前点的子数组和为 k 的不同情况。因此,每当我们找到一个 sum - k 存在于 Map 中时,我们就把它的计数(即之前这种情况发生的次数)加到 count 上,因为这表示我们又找到了相应数量的以当前元素结束的子数组,其和为 k。
2025-09-17 15:18:26
341
原创 LeetCode:9.找到字符串中所有的字母异位词
这道题我们可以通过滑动窗口的思想来解决,先通过哈希表来统计字符串p中每一个字母所出现的个数,同时用另一个哈希表来统计字符串s中个字母所出现的次数,如果s中字母出现的次数小于等于p中所出现的次数,那么这就是一个有效字符,用count来统计有效字符的个数,如果当前窗口中长度大于p的长度,我们就需要出窗口,同理如果s中出现的次数小于等于p中出现的次数,说明出去了一个有效字符,count--,如果count等于p的长度,就找到了一个有效的结果。
2025-09-17 14:57:21
527
原创 LeetCode:8.无重复字符的最长字串
这道题可以通过滑动窗口的思想来解决,通过left和right指向字符串的开头,right++来统计每一个字符出现的次数,如果大于1了,就说明当前的窗口中有重复的字符,我们将left所指向的字符的个数减1,同时left++,在这里我们可以使用一个定长数组来模拟哈希表,这样就可以将空间优化到O(1)的程度。
2025-09-16 22:54:03
112
原创 LeetCode:6.三数之和
对于这道题我们通过三次遍历肯定是可以解决的,但是应该会超时,这道题可以通过双指针来解决,我们可以先对数组进行排序,这样当第一个数大于0的时候就没有结果,同时我们可以将三数之和转化为两数之和,将第一个数设置为aim,在后续的数组中寻找两数之和为-aim,同时因为数组有序,和大于-aim了,就--right,小于就++left。在这里还需要注意一个细节问题,我们的三元组是不能重复的,所以找到一个目标值后需要进行一个去重操作,查看++left, --right,++i后面的值是否相等。
2025-09-16 20:21:17
236
原创 LeetCode:5.盛最多水的容器
这道题可以通过双指针来解决,我们分别用left和right来指向左右的起始位置,计算出当前的数值,同时移动left和right值较小的那一个,正如木桶原理,能接水的多少是由短的那一块木板决定的,所以我们通过移动较小值来不断更新,直到取到最大值。
2025-09-16 09:43:44
189
原创 LeetCode:4.移动零
这道题,我们可以通过双指针来解决,cur指向数组的开头,prev指向cur前一个位置,遍历数组,当遇到0的时候,cur向前移动,prev不动,遇到非零元素时,prev向前移动一步,同时交换cur和prev的值。下面是具体的执行过程。
2025-09-16 09:35:42
215
原创 LeetCode:3.最长连续序列
这道题来说,我们可以通过遍历数组,去查找数组中是否存在当前值-1的数字,因为如果存在了当前数-1的数字的话,以当前数字为开头就不是最长连续序列,找到了开头之后就不断的+1,判断是否存在,在最后可以进行一个小优化,如果说当前的长度已经大于或等于了二分之一的数组长度的话,就可以直接返回了,因为不存在更长的连续序列。
2025-09-16 00:12:07
484
原创 LeetCode:2.字母异位词分组
对于这道题来说,关键的地方在于字母异位词他们排序后的字符串完全相等,所以我们可以通过哈希表来建设一个字符串和其排序相同的字符串数组的映射关系。我们通过遍历整个字符串数组,将排序后相同的字符串插入同一个数组,最后只需要遍历哈希表,将结果插入结果数组中即可。
2025-09-16 00:01:02
435
原创 MySQL复合查询
实际开发中往往数据来自不同的表,所以需要多表查询。多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句。案例:显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自EMP和DEPT表,因此要联合查询。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。使用多表查询(自查询)
2025-07-05 14:50:35
932
原创 MySQL基本查询
面试题:SQL查询中各个关键字的执行先后顺序 from > on> join > where > group by > with > having > select > distinct > order by > limit。建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死。案例: 准备工作,创建一个雇员信息表( EMP员工表 DEPT部门表 SALGRADE工资等级表)案例:删除表中的的重复复记录,重复的数据只能有一份。可以选择性的进行同步更新操作。
2025-07-04 17:06:58
1477
原创 MySQL表的约束
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候, 用户可以选择性的使用默认值。
2025-07-04 14:02:09
788
原创 数据库数据类型
varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844,因为utf中,一个字符占用3个字节,如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符 占用2字节)
2025-07-03 18:44:45
1114
原创 表相关操作
在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎等等。我们还有需求,添加字段,删除字段等等。这时我们就需要修改表。不同的存储引擎,创建表的文件不一样。
2025-07-03 16:32:10
285
原创 数据库操作
说明:当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则是:utf8_ general_ ci。对数据库的修改主要指的是修改数据库的字符集,校验规则。将test1数据库字符集改成gbk。
2025-07-02 22:01:26
618
原创 Linux进程控制
fork函数初识在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以 开始它们自己的旅程,看如下程序这里看到了三行输出,一行before,两行after。进程43676先打印before消息,然后它有打印after。另一个after 消息有43677打印的。注意到进程43677没有打印before,为什么呢?如下图所示。
2025-02-10 22:23:55
2055
36
原创 Linux进程概念
为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在 Linux内核里,进程有时候也叫做任务)。需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。可以理解nice值是进程优先级的修正修正数据。每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串。通过系统调用获取进程标示符,通过系统调用创建进程-fork初识。
2025-02-04 22:11:35
1598
42
原创 冯诺依曼系统及操作系统
目录一.冯诺依曼体系结构二.操作系统三.系统调用和库函数概念我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系截至目前,我们所认识的计算机,都是由一个个的硬件组件组成关于冯诺依曼,必须强调几点:概念任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:设计OS的目的定位如何理解"管理"总结计算机管理硬件:
2025-01-28 11:30:23
2095
46
原创 yum和vim的使用
在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装. 软件包和软件包管理器,
2025-01-14 13:37:59
2818
44
原创 Linux权限
目录的可执行权限是表示你可否在目录下执行命令如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这 个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读 权限所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。
2025-01-11 21:27:41
2176
33
原创 leetcode题目(2)
目录1.删除有序数组中的重复项2.移除元素3.找出字符中第一个匹配项的下标4.搜索插入位置5.最大子数组和6.最后一个单词的长度https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/2.移除元素https://leetcode.cn/problems/remove-element/3.找出字符中第一个匹配项的下标https://leetcode.cn/problems/find-the-i
2024-12-31 00:20:27
1905
91
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人