自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

原创 算法019—— x的平方根

我们定义一个变量 ret 表示最终结果,最终结果会将整个数组划分成两个区域。当 x = 17 时,返回 4,我们发现此时 4 的平方根小于 x。当 x = 36 时,返回 6,我们发现此时 6 的平方根等于 x。mid 的平方在哪个区间内,有两种情况。根据这个我们可以找到题中的 二段性。因此我们可以使用二分查找来解决问题。

2025-03-23 19:38:57 287

原创 算法018——在排序数组中查找元素的第一个和最后一个位置

如果 x >= t ,上一篇普通的二分查找是让 right = mid - 1,如图所示,如果 mid 的位置刚好是左端点,那么 right 更新后将找不到左端点,会错过。我们先看第一种情况,到最后一步的时候,mid 此时指向 left 的位置,当 x <= t 时,left = mid,此时程序将会陷入死循环。所以第一种情况不可以。我们先看第二种:到最后一步的时候,mid 指向的位置是 right 的位置,如果此时 x >= t,那么让 right = mid,会陷入死循环,所以第二种不可以。

2025-03-23 12:03:07 1298

原创 算法017——二分查找

在求 mid 的时候,我们通常使用 (left + right) / 2,如果数据量非常大的题,其实是有溢出的风险的,left + right 会溢出,因此,我们会用另一种方法来求中间点。如果 x > t 就说明 t 不在右半部分,此时让 right = mid - 1,然后在更新后的区域中找目标值,一直循环,直到找到目标值。如果 x < t 就说明 t 不在左半部分,此时让 left = mid + 1,然后在更新后的区域中找目标值,一直循环,直到找到目标值。那么,x 与 t 的关系共有三种情况。

2025-03-18 21:08:34 345

原创 算法016——最小覆盖子串

进窗口,要在相等的时候比较,相等说明此时进窗口的字符为有效字符,之后让 count++,如果按照上一道题,大于等于来比较的话,会有重复。出窗口时,加入 left 与 right 在如图所示的位置上,我们要在出窗口之前判断,等于说明出窗口的为有效字符,让 count–我们先随便从一个位置开始,让 right 右移,直到找到符合题目的位置停下。之后,让 left 右移,此时会出现两种情况。跟上两篇博客一样,我们可以对判断条件做出优化。此时,窗口满足出窗口,让 left 右移。完成了,我要累死了,休息。

2025-03-17 21:22:06 382

原创 算法015——串联所有单词的子串

定义一个变量 len 表示 words 中每个字符串的长度,固定 left ,让 right 右移,此时 right 右移应该移动 len 个长度。这样看,此问题就可以转化为,在 s 这个字符串中找出一个子串是 words 的子串的异位词,建议大家在解决这个问题之前可以查看我的上一篇博客。同样, left 移动的时候也需要移动 len 个长度。这两道题的原理相同,所以可以采用。剩下的原理与上道题相同,直接给代码。,所以我们可以这样看这个字符串。这道题与上到题不同的方有三点。的方法来解决此问题。

2025-03-17 18:01:44 396

原创 算法014——找到字符串中所有字母异位词

此时,窗口大于 m ,让 left 右移,再将第一个 c 从 hash2 中删除之前,我们要先判断此时这个字符出现的次数是否大于 hash1 中的次数,这种情况,显然是大于,那么删掉的就是无效字符,count 不需要变化,此时 c 的个数变成了 1。我们定义一个变量 m 表示 p 字符串的长度,我们将 p 字符串中字母出现的次数存放在 hash1 中,在 s 这个字符串中,找到长度为 m 的子串 ,将次数存放到 hash2 中,然后比较两个哈希表是否相等就可以。接下来的遍历就省略了。

2025-03-16 16:01:52 942

原创 算法013——水果成篮

定义两个指针 left 与 right ,固定 left , 当 right 走到一个位置时,left 与 right 之间的种类 kind = 2 , 当 right 再往后走一个位置时, kind > 2。之后我们让 left 右移,黄色划线区域 kind = 2, 那么粉色划线区域的 kind 肯定小于等于 2,所以 right 没有必要回到 left 的位置重复判断。然后我们根据此时的划线区域的 kind 的情况,来分析 right 的情况。根据上述分析,我们可以使用滑动窗口的方法来解决此问题。

2025-03-16 12:47:14 410

原创 算法012——将x减到0的最小操作数

此时,我们让 left 右移,right 不需要回到 left 的位置,因为粉色划线区域的和小于 target ,left 向右移,此时 left 到 right 的前一个位置的和会更小,所以 right 不用动。其实这个问题等价于,在数组中找出最长的子数组的长度 len,使其和为target = sum - x (sum 为数组中所有元素的和),最后所求的长度就是 n - len (n为数组的长度)定义两个指针 left 与 right ,固定 left,让 right 右移。

2025-03-16 10:27:59 350

原创 算法011——最大连续1的个数

让 left 右移一个位置,如下图所示,如果我们让 right 也回到 left 的位置, 我们发现,当 left 在粉色划线区间时,right 都会在相同的位置停下,并且,此时我们所求的数组长度都比第一次的情况小,所以我们让 left 跳过此区间,此时 left 与 right 之间的区间是一个合法区间,所以我们也不需要让 right 回到 left 的位置,right 不动即可。此时,如下图所示,right 在 zero > k 的位置停下。根据上述分析,我们可以使用滑动窗口的方法来解决这个问题。

2025-03-15 18:13:13 406

原创 算法010——无重复字符的最长子串

因为前面的 a 是与 right 位置的 a 重复的,以粉色划线区域为起始位置,也就是 left ,right 最多能跑到 第二个 a 的位置,此时的长度还没有第一次的长,所以我们让 left 跳过这个区间,也就是跳过第一个 a ,此时 left 跳过重复字符。其实,right 没有必要回到 left 的位置,因为 left 已经跳过了重复字符,所以 在粉色划线区间内并没有重复字符,所以 right 的位置其实不用动。如下图所示,我们发现 right 此时停止的位置是 上次 right 停止的位置。

2025-03-15 16:59:41 172

原创 算法009——长度最小的子数组

此时出窗口,让 left 右移 , 继续判断,(我们无需将 right 移动到 left 的位置,right的位置保持不变,因为从上一个left到right的和上一次已经算过了,我们只需要减去上一个 left 即可,如图片所示,sum - 2就可以知道以left 为左区间的所有子数组的和),让 right 进窗口,找到 sum = target 的,更新 len,让 left 出窗口,后面重复此操作,下图为例子的演示过程。如果此时 sum 大于 target ,更新 len(区间长度)

2025-03-09 13:36:33 186

原创 算法008——四数之和

那么在四数之和当中,我们也可以先依次固定一个数,我们将这个数存放到 a 中,在剩下的区间内找三数之和为target - a 的三个数,此时问题又回到了 三数之和。当我们找到了一组数据时,即两数之和相加等于 target - a - b,此时不要停,缩小范围,继续找,将这组数据存储下来后,让 left++,right–在剩下的区间内,我们依次固定一个数,将它存放到 b 中,在剩下的区间内找到 两数之和为 target - a - b 的两个数。接下来让我们思考怎样去重,在 三数之和 当中,去重的情况有两种,

2025-03-09 11:42:17 710

原创 算法007——三数之和

如果是正数,如下图所示,此时 i 为 1,那么 target = -1,后面都为正数,根本找到不到和为 负数 的两个数。在指针移动的时候,我们会遇到找到结果的时候,如下图所示,此时 不要停,要缩小区间,继续寻找。当第一个固定的元素找完之后,i 会遍历整个数组, i 也会遇到相同的元素,也需要跳过。根据前两篇博客我们可以完成查找,原理相同,不做过多讲解,可以翻看前两篇博客。在指针移动过程中,会遇到相同的元素,如下图所示,将元素跳过即可。最后我们要思考的是如何去重,我们已经将数组排序。

2025-03-09 09:58:09 407

原创 算法006——和为S 的两个数

right 与最小值相加都大于 target,此时中间的数都大于 left ,那么 right 无论与中间的哪个数相加 都会大于 target ,此时 right 是没用的,让 right –left 与最大值相加都小于 target ,此时中间的数都小于 right,那么 left 无论与中间的哪个数相加,都是小于 target 的 ,此时 left 是没用的,让 left ++我们利用双指针,不管 target 是多少,让一个指针指向最小值,让一个指针指向最大。我们首先遇到的是第二种情况。

2025-03-08 19:22:45 472

原创 算法005——有效三角形个数

此时,中间的数都 大于等于 a ,那么 中间的数 + b 都大于等于 c ,我们就不需要判断中间的数与 9 相加了,此时构成三角形的个数为。因为 C 已经是三边之中最大的了,无论加不加第二条边,都会比第三条边大,所以无需判断第一张图片中的后两种情况。但是运用这个方法,我们需要判断三次,有一个更简单的方法,只需要判断一次。如果按顺序枚举,时间复杂度太大,我们先用剩下的数的 最小值 与 最大值。排序完成后,我们先固定最大的数,然后枚举剩下两个数。,那么 9 就没用了,让 right –

2025-03-08 17:50:45 305

原创 算法004——盛最多水的容器

我们先选择6和4来计算容积,再选择其中较小的数来进行枚举,即以 4 来进行枚举,无论4跟谁一起容积都变小,所以4就不需要考虑了。当我们选择1号线和6号线时,高度为 8,宽度为 5,此时容积为 40,这个情况没有示例一多,所以示例一就是容积最大的情况。当我们选择1号线和8号线时,下标为 1 和 8 形成容器的容积的高度是由 较矮的决定的,即下标为 8 的位置;我们先不看那么多数,从简单的开始分析,例如,分析中间的 6到4,即数组为 [6,2,5,4].

2025-03-02 20:25:54 453

原创 算法003——快乐数

无论是示例一还是示例二,都形成环,我们要判断这个数是否是快乐数,只需判断环内的值是多少就可以,看环内的数是否为1。定义快慢指针,快指针每次向后移动两步,而慢指针每次向后移动一步,在环内相遇地方的值为1,则该数为快乐数。根据题目示例,分为两种情况,示例二无限循环始终变不成1.

2025-03-02 14:08:09 366

原创 算法002——复写零

当我们出现 越界 情况时, 此时一定是因为 cur 指向 零 导致的,此时我们将最后一个位置修改成 零 ,然后让 dest 向前移动两位, cur 向前移动一位,然后继续完成复写操作。在 cur++ 前,我们要判断 dest 是否越界,当 cur 指向 零 时,而 dest 此时正在数组的最后一个位置,这个情况 dest 向右移动两位会越界。这道题还是运用 双指针,我们从左往右开始,让 cur = 0,dest = 0,当我们循环时,会覆盖后面的值,所以从左到右无法实现,我们运用。cur 会遇到两种情况。

2025-03-01 20:16:13 533

原创 算法题001——移动零

先定义两个指针,分别为 dest 和 cur , cur用来遍历整个数组,而 dest 表示我们已经完的数组的最后一个位置。当 cur 的位置不等于 0 时,我们让 dest++ ,并将 dest 位置的值 与 cur 位置的值互换。首先,定义 cur 从0 位置开始遍历,此时,并没有处理完的部分,所以定义 dest = -1;首先,定义 cur 从0 位置开始遍历,此时,并没有处理完的部分,所以定义 dest = -1;cur 前为 处理完的部分,cur 后为 未处理的部分。

2025-03-01 19:05:02 365

原创 Java之链表1

之前我们学习了 顺序表ArrayList,并自己实现了 ArrayList ,发现它在删除元素和添加元素时很麻烦,最坏的情况时,需要将所有的元素移动,因此在插入和删除较多的情况下使用 ArrayList 很麻烦,于是 Java 则引入了链表 LinkedList。这就是一个结点,data 存储数据,next 存储下一个结点的地址。由一个一个结点组织起来的就是链表。链表的结构不止这一种,总共有八种。完整代码(测试类自己写哦)终于完事了,我要好好躺着了。但其实就学两个,吓死你。这次的图画的完美多了。

2024-12-01 20:14:49 453

原创 时间复杂度与空间复杂度

有些人认为算法的时间复杂度就是将代码运行的结束时间 - 运行开始的时间 ,这其实是不对的,当我们使用不同的电脑运行同一段代码,运行时间是不一样的,例如你用二十年前的电脑,我用现在的电脑,这没有可比性。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。随着 N 的值越来越大,F(N)越来越大,2N 和 10 都可以忽略不计。** 递归的时间复杂度 = 递归的次数 * 每次递归后代码执行的次数 **:算法是否能够适应输入数据规模的增长,而不需要进行大规模的修改。(这里的N表示问题的规模)

2024-12-01 20:08:45 904

原创 List、ArrayList与顺序表1

在集合框架中,List是一个接口,继承与Collection接口,也继承于Iterable接口。Collection接口中主要规范了后序容器中常用的一些方法Iterable接口表示实现该接口的类是可以逐个元素进行遍历的但是站在数据结构的角度来看,List是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作。

2024-11-16 18:44:57 1505

原创 数据结构之集合框架

数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。这篇博客的内容了解即可,最重要的是类和接口那个图,记不住没关系,接下来我们将围绕着这个图来进行讲解,多用就记住啦!

2024-11-16 13:37:50 758

原创 Java之多态

回归正题,什么是多态呢其实,上述代码就发生了多态,当 animal 引用的对象不一样,调用 eat 方法,表现的行为不一样,此时就叫多态。同一个引用调用同一个方法表现的行为不一样。

2024-09-28 21:29:27 784

原创 Java之继承

在Java中我们定义猫类和狗类,如下根据图片我们可以发现猫类和狗类有大量重复的代码,我框住的就是重复的地方。在Java中,于是就提出了这个概念,用来抽取共性。

2024-09-21 22:36:20 845

原创 Java之封装

在Java中,面向对象程序三大特性:封装、继承、多态,而封装就是将对象的状态(数据)和行为(方法)打包在一起,并隐藏对象的内部实现细节,只提供公开的接口(getter和setter方法)来与对象进行交互。包其实就是一个文件夹,为了更好的管理,我们将类划分,把多个类收集成一组,就是一个包。例如:我们将D盘中的文件划分,将Java语言相关的文件放到Java包中,将C语言相关的文件放到C语言包中,将下载的软件放到app这个包中……在Java中,包是一种用来组织和管理类和接口的机制。

2024-09-20 22:35:56 1579

原创 Java之类和对象

Java面向对象的概念是指在计算机层程序中,模拟现实世界中的概念,借助对象的描述在计算机中用类似的实体模拟现实世界中的实体。在面向对象的世界里,一切皆为对象,面向对象主要依靠对象之间的交互来完成一件事。面向对象关注的是对象,是现实生活中的实体,例如一名学生,他有名字,学号,性别,班级,年龄,生日,籍贯等属性,这些属性是对这个学生的描述。在Java中是这样定义类的要用到class关键字,class是定义类的关键字。field;//成员变量method;//成员方法//学号//姓名//性别。

2024-09-05 22:11:27 742 1

原创 Java数组2

我们为什么要遍历数组而不是直接打印数组呢?我们来一看一下直接打印数组会发生什么直接打印得到的并不能得到遍历的效果,而是一串奇怪的编号,我们来一起了解它的组成如果我们将后面当做一个地址,那么它存储的是的地址。:数组存储的是,而不是直接将数据存储在数组中,因此,数组不是基本数据类型,而是。除了运用之前我们学过的for循环、while循环等,Java自己提供了遍历数组的方法。

2024-08-27 21:42:32 950

原创 Java数组1

在Java中,数组用于存储相同类型的多个元素,即数组可以理解为是相同类型元素的集合。例如数组的特点连续的内存存储得是相同数据类型的数据集合那么我们应如何创建数组呢?

2024-08-10 19:50:32 551 1

原创 MySQL的增删改查2

GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用。询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须。示例:创建一张用户表,有姓名、性别、年龄、qq邮箱、手机号字段,将已有的学生数据复制进来。实际开发中往往数据来自不同的表,所以需要多表联合查询,需要对多张表取笛卡尔积。行了,连接这是不懵了,等我下篇会详细讲解,请点点关注期待我的下一篇文章。例如:指定学号为唯一的,重新重新创建学生表。

2024-06-05 22:09:52 1213 2

原创 MySQL的增删改查

CRUD在MySQL中指的是增加(create),查询(retrieve),更新(update),删除(delete)。

2024-05-31 22:15:48 936

原创 MySQL数据库基础

MySQL数据库基础

2024-05-18 22:14:18 211

原创 Java之方法的使用

方法就是一个代码片段. 类似于 C 语言中的 “函数”。那么方法为什么会出现呢?当我们在写代码时会经常出现一段代码重复出现,每次都要我们来写真的很麻烦,于是出现了方法,将重复的代码块构成一个方法,那么我们只需要写一遍就能够多次调用这个方法。例如:在数组中,我们需要多次判断数组是否为空,那么我们就可以定义一个判断数组是否为空的方法。那么应该如何定义方法?在Java中,方法是一段用来执行特定任务的代码,它包括方法名称、参数、返回类型和方法体。在java当中,方法必须写在类当中语法格式// 方法定义。

2024-05-04 10:25:09 661 1

原创 逻辑控制2

Java逻辑控制2

2024-03-16 14:18:11 350 1

原创 逻辑控制1

Java的逻辑结构

2024-03-15 21:23:04 851 1

原创 Java之运算符

Java之运算符

2024-03-13 22:27:36 1627

原创 数据类型与变量

Java的数据类型与变量

2024-03-06 20:04:09 1621

原创 初识Java

初识Java

2024-03-03 16:26:45 825

原创 C语言的常见概念2

C语言常见概念2

2024-01-12 14:01:44 1854 1

原创 C语言的常见概念1

C语言常见概念

2024-01-10 18:04:39 407

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除