- 博客(82)
- 问答 (1)
- 收藏
- 关注
原创 LeetCode:14.合并区间
所以这道题的具体思路为:先对原数组进行排序,便于合并,同时遍历数组取到左端点和右端点,如果结果数组为空,或者结果数组的右端点小于原数组的左端点,说明不能合并,直接插入即可,否则在结果数组右端点和原数组右端点中取出较大的一个更新边界。对于这个原数组来说,我们并不知道这个区间可以和哪一个区间合并,可能是下一个,也可能是中间任意一个,所以为了方便思考,我们可以将原数组进行排序,这样,如果当前区间不能和下一个合并,就可以肯定它不能合并了。
2025-09-18 00:21:40
98
原创 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
75
原创 LeetCode:12.最小覆盖字串
这道题和第9题找到字符串中所有的字母异位词的思想基本一致,只不过在其中添加了统计字符串t中字符的种类,与第9题不同的是当s和t中字符出现的次数相等时,我们才认为这是一个有效字符,而不是个数小于等于t就认为有效,当count等于kinds的时候这就是一个有效字符,我们将其与INT_MAX比较取出最小的长度,若是当前的长度大于minlen,就收缩left,去下一个区间寻找最小的长度。
2025-09-17 22:32:32
210
原创 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
221
原创 LeetCode:9.找到字符串中所有的字母异位词
这道题我们可以通过滑动窗口的思想来解决,先通过哈希表来统计字符串p中每一个字母所出现的个数,同时用另一个哈希表来统计字符串s中个字母所出现的次数,如果s中字母出现的次数小于等于p中所出现的次数,那么这就是一个有效字符,用count来统计有效字符的个数,如果当前窗口中长度大于p的长度,我们就需要出窗口,同理如果s中出现的次数小于等于p中出现的次数,说明出去了一个有效字符,count--,如果count等于p的长度,就找到了一个有效的结果。
2025-09-17 14:57:21
496
原创 LeetCode:8.无重复字符的最长字串
这道题可以通过滑动窗口的思想来解决,通过left和right指向字符串的开头,right++来统计每一个字符出现的次数,如果大于1了,就说明当前的窗口中有重复的字符,我们将left所指向的字符的个数减1,同时left++,在这里我们可以使用一个定长数组来模拟哈希表,这样就可以将空间优化到O(1)的程度。
2025-09-16 22:54:03
111
原创 LeetCode:6.三数之和
对于这道题我们通过三次遍历肯定是可以解决的,但是应该会超时,这道题可以通过双指针来解决,我们可以先对数组进行排序,这样当第一个数大于0的时候就没有结果,同时我们可以将三数之和转化为两数之和,将第一个数设置为aim,在后续的数组中寻找两数之和为-aim,同时因为数组有序,和大于-aim了,就--right,小于就++left。在这里还需要注意一个细节问题,我们的三元组是不能重复的,所以找到一个目标值后需要进行一个去重操作,查看++left, --right,++i后面的值是否相等。
2025-09-16 20:21:17
207
原创 LeetCode:5.盛最多水的容器
这道题可以通过双指针来解决,我们分别用left和right来指向左右的起始位置,计算出当前的数值,同时移动left和right值较小的那一个,正如木桶原理,能接水的多少是由短的那一块木板决定的,所以我们通过移动较小值来不断更新,直到取到最大值。
2025-09-16 09:43:44
151
原创 LeetCode:4.移动零
这道题,我们可以通过双指针来解决,cur指向数组的开头,prev指向cur前一个位置,遍历数组,当遇到0的时候,cur向前移动,prev不动,遇到非零元素时,prev向前移动一步,同时交换cur和prev的值。下面是具体的执行过程。
2025-09-16 09:35:42
167
原创 LeetCode:3.最长连续序列
这道题来说,我们可以通过遍历数组,去查找数组中是否存在当前值-1的数字,因为如果存在了当前数-1的数字的话,以当前数字为开头就不是最长连续序列,找到了开头之后就不断的+1,判断是否存在,在最后可以进行一个小优化,如果说当前的长度已经大于或等于了二分之一的数组长度的话,就可以直接返回了,因为不存在更长的连续序列。
2025-09-16 00:12:07
456
原创 LeetCode:2.字母异位词分组
对于这道题来说,关键的地方在于字母异位词他们排序后的字符串完全相等,所以我们可以通过哈希表来建设一个字符串和其排序相同的字符串数组的映射关系。我们通过遍历整个字符串数组,将排序后相同的字符串插入同一个数组,最后只需要遍历哈希表,将结果插入结果数组中即可。
2025-09-16 00:01:02
399
原创 MySQL复合查询
实际开发中往往数据来自不同的表,所以需要多表查询。多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句。案例:显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自EMP和DEPT表,因此要联合查询。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。使用多表查询(自查询)
2025-07-05 14:50:35
931
原创 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
1474
原创 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
2051
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
2817
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
原创 Linux发展历程及环境搭建
学习Linux系统编程,你可能要问Linux从哪里来?它是怎么发展的?在这里简要介绍Linux的发展史。要说Linux,还得从UNIX说起1968年,一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新概念1969-1970年,AT&T的贝尔实验室研究人员Ken Tompson和Dennis Ritchie,在采用很多Multics特点的基础上开发了UINX系统。
2024-12-19 00:03:14
2263
91
原创 LRU Cache
LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache── 称为Internet临时文件夹或。DRAM技术,而使用昂贵但较快速的SRAM技术。广义上的Cache指的是位于速度相差较大的两种。狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用。硬件之间, 用于协调两者数据传输速度差异的结构。
2024-12-17 00:06:40
1600
80
原创 数据结构——跳表
假如我们每相邻两个节点升高一层,增加一个指针,让指针指向下下个节点,如下图b所 示。这样所有新增加的指针连成了一个新的链表,但它包含的节点个数只有原来的一半。由 于新增加的指针,我们不再需要与链表中每个节点逐个进行比较了,需要比较的节点数大概 只有原来的一半,以此类推,我们可以在第二层新产生的链表上,继续为每相邻的两个节点升高一层,增加一 个指针,从而产生第三层链表。如下图c,这样搜索效率就进一步提高了
2024-12-14 00:02:53
4847
82
原创 数据结构——B-树
1970年,R.Bayer和E.mccreight提出了一种适合外查找的树,它是一种平衡的多叉树,称为B树 (后面有一个B的改进版本B+树,然后有些地方的B树写的的是B-树,注意不要误读成"B减树")。一 棵m阶(m>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树或者满足以下性质:
2024-12-10 00:01:42
6142
74
原创 数据结构——图(遍历,最小生成树,最短路径)
Kruskal算法(克鲁斯卡尔算法)任给一个有n个顶点的连通网络N={V,E}, 首先构造一个由这n个顶点组成、不含任何边的图G={V,NULL},其中每个顶点自成一个连通分量, 其次不断从E中取出权值最小的一条边(若有多条任取其一),若该边的两个顶点来自不同的连通分量,则将此边加入到G中。如此重复,直到所有顶点在同一个连通分量上为止
2024-12-06 00:01:31
7179
68
原创 数据结构——并查集
在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一 个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-find set)
2024-12-03 00:02:52
1606
65
原创 C++:特殊类设计及类型转换
拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可C++11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上 =delete,表示让编译器删除掉该默认成员函数。
2024-12-01 00:01:58
3242
60
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人