自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

日暮南城故里的博客

学习Java的漫漫道路

  • 博客(43)
  • 收藏
  • 关注

原创 搜索算法------DFS练习2

从题目中可以看出,如果一个格子上有雨水,那么就可以流到周围比他高度低的单元格,如果单元格和海洋相邻,那么雨水也会流入海洋。总而言之一句话就是水从高处流向低处。从这里的流向可以联想到深度优先搜索这个算法。所以要换个思路,既然雨水从高流向低,并且靠近海洋的会直接流入海洋,那么我们在采用深度优先搜索的时候,下一个就要去找更大的单元格,利用反向搜索的思路去解决问题。在进行反向搜索的时候,如果一个单元格既可以从太平洋反向到达,又可以从大西洋反向到达,那么这个单元格就是我们需要的单元格。

2025-04-02 21:20:35 138

原创 搜索算法-------DFS练习1

这道题的意思就是,给定我们一个矩阵,然后我们需要去寻找没有相连的最大的个数。这里可以看示例中的例子,比如示例1,1和2相连,则它们就是一个省份,3不与1和2相连,则它就是一个省份,因此省份数为2.又比如示例2,这里的1,2和3都是单独的一个元素,因此就是3个省份。所以这道题就可以用深度优先搜索进行求解,先选取一个顶点,然后从这个顶点出发,往下进行探索,直至探索到最后一个元素,探索完成之后,省份数就加一,然后再去选择之前没探索过的一个顶点,继续进行探索,探索结束之后,省份数再加一,直到所有的顶点都探索结束。

2025-04-01 21:54:39 403

原创 搜索算法------深度优先搜索

深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。这种算法通过尽可能深地搜索图的分支来探索解决方案空间,直到达到一个没有分支的点,然后回溯。

2025-03-31 22:50:00 469

原创 Java中的日期处理

原先的日期API存在线程安全问题,在单线程的情况下不会出现什么问题,但是在高并发的情况下,就会出现问题了,为了解决这一问题,Java8提供了一套全新的API来处理日期。API描述日期、时间、日期时间时间戳信息计算两个时间对象之间的时间间隔,精度为纳秒计算两个日期之间的时间间隔,以年、月、日为单位提供了一些方法用于方便的进行日期时间调整用于进行日期时间格式化和解析。

2025-03-31 21:07:37 1258

原创 常用的排序算法------练习4

虽然这种方法可以通过,但是时间复杂度很高,然后查看了官方给出的题解,官方是先统计数组中0,1,2的个数,然后根据他们的数量,重写整个数组。初始化两个指针分别指向0和nums.length - 1,然后如果遇到0,就交换到数组的头部,遇到2,就交换到数组的尾部,当遍历的数组超过了右指针,则遍历结束。这道题是很经典的荷兰国旗问题,根据题目意思,要对这个数组按照颜色排序,而此时现在的红、白、蓝三个颜色分别对应0,1,2,因此可以想到使用冒泡排序对该数组进行排序。

2025-03-30 20:13:26 334

原创 Java学习------源码解析之StringBuilder

StringBuilder的扩容策略是从当前容量开始,每次扩容为原来的2倍再加2如果一开始拼接的字符串的长度就超过了默认初始容量16时,那么StringBuilder扩容的容量就直接为一开始的字符串长度如果我们想要进行优化,那么就要在创建StringBuilder时,预估一下我们要拼接的字符串的长度,然后给定一个合适的初始化容量,从而减少底层的扩容操作。

2025-03-29 22:00:38 1727

原创 常用的排序算法------练习3

这道题和昨天那道347题一样,也是用桶排序来做。

2025-03-28 18:07:51 449

原创 常用的排序算法------练习2

对于这道题来说,就可以构建一个List数组桶,然后依次num加入数组,如果出现的次数相同,那么就加到一个ArrayList中,然后再从后往前遍历桶,找出频率前k高的元素。这种题可以用桶排序来做,什么是桶排序呢?桶排序就是一种将待排序数据分到几个有序的桶里,每个桶里的数据再分别排序的排序算法。

2025-03-27 19:43:56 353

原创 排序算法------练习1

这道题其实就是用昨天总结的常用排序算法里的快速排序。因为每次经过划分操作之后,一定是可以确定出一个元素的最终位置,因此我们不需要全部排序完成,只需要某次划分的。个下标的时候,就已经确定了答案。

2025-03-26 20:09:24 224

原创 常用的排序算法

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

2025-03-25 20:21:53 1998

原创 二分查找------练习3

这道题看到这个复杂度,就想到应该是使用二分查找进行求解。为了使二分查找的次数尽可能的少,我们需要对较短的数组进行查找,假设就在nums1上进行操作,因此在开始时,要对两个数组的长度进行一个判断,如果nums1的长度大于nums2的长度,就直接交换一下两个数组。接下来就是进行查找。这个时候就需要对两个数组进行划分,但是不管如何划分,都必须要保证左半部分的最大值小于右半部分的最小值。

2025-03-24 21:34:05 178

原创 二分查找------练习2

根据这个思路,如果我们所求的mid是奇数,则将其减1,以确保mid和mid+1是一对元素,如果mid和mid+1位置的元素是相等的,那么就说明单独的元素在右侧,这个时候将left更新为mid+2,如果元素不相等,单独的元素要么在左侧,要么就是此时mid位置对应的元素,这个时候将right更新为mid,最后当left和right相等时,那么我们就找到了单独的元素,然后进行输出即可。对题干进行分析,在nums数组中,每个元素都会出现两次,并且只有一个数会出现一次,那么这个数组长度一定是奇数。

2025-03-23 17:36:25 417

原创 二分查找------练习1

这道题和81题其实很像,也是用二分查找进行求解。也是需要在原二分查找的基础上缩减范围。所以整体的代码如下:

2025-03-22 18:45:22 441

原创 Java学习------常用类String

Java中的String属于引用数据类型,Java专门在堆中准备了一个字符串常量池。我们在开发时,字符串使用的频率是很高的,因此将这些字符串放在常量池中可以省去对象的创建过程,提高效率。常量池属于一种缓存技术,缓存技术是一种可以提高程序执行效率的手段。字符串一旦创建是不可变的。查看源码后发现是因为其前面使用了final修饰。这里的不可变指的是字面量不能变,就比如String s1 = “hello”;

2025-03-22 16:49:36 902

原创 二分查找------旋转数组查找数字

这道题和力扣的33题很相似,解法还是差不多的。题目还是比较绕的,需要仔细地理清思路,进行理解。

2025-03-21 17:57:16 270

原创 二分查找------查找区间

这道题虽然是道中等题,并且看起来很复杂,但是实际上就是给定一个数组和目标值,让我们去寻找该目标值在数组中的位置。题目还提到说设计O(log n)的算法解决问题,更进一步暗示我们去用二分查找。

2025-03-20 19:59:55 283

原创 二分查找------求开方

二分查找(Binary Search)是一种在数组中查找某一特定元素的搜索算法。二分查找的过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或小于中间元素,则搜索过程将在数组的大于或小于中间元素的那一半区域中继续,以此类推,直到找到要查找的元素,或者剩下的半区域为空。

2025-03-19 18:09:56 319

原创 双指针算法------练习3

假设我们现在取了dictionary的第一个元素t,要判断s是否可以通过删除一些字符后可以和这个元素匹配,那么常规的思路就是去同时从头开始遍历两个字符串。既然存在了两个字符串要去作比较,那么就可以初始化两个指针i和j,i指向s的第一个位置,j指向t的第一个位置,然后开始比较。题目要求的是长度最长且字母序最小的字符串,那么不管这个题目后续如何去思考,为了简化后续这个条件的判断,就要对dictionary这个字符串数组进行排序,如果j指针能够移动到t的末尾,那么就说明,完全匹配上了,这个时候返回t即可。

2025-03-18 19:10:46 311

原创 Java学习------内部类

定义在一个类中的类。

2025-03-17 23:21:25 257

原创 双指针算法------练习2

这道题也是用双指针思路进行解决,在开始时初始化两个指针分别指向字符串的开始和结束位置,然后判断这两个位置的字符是否相等,如果相等,则同时将指针向中间移动一个位置,如果不相等,则删除其中一个字符。然后判断剩下的字符串是否是回文串,走到这一步操作,是否感觉似曾相识呢?没错,这不就回到了原本的题目吗,所以这里就又回到了和之前一样的问题,就可以继续按照之前的思路进行下一步求解。

2025-03-17 20:21:42 248

原创 Java学习------static、final、this、super关键字

static、final、this、super关键字

2025-03-17 20:02:12 394

原创 Java学习------抽象类和接口

在Java开发的时候,如果类中的方法无法实现或者没有意义,此时就需要将该方法定义为抽象方法,与此同时,该类也就要定义为抽象类。这样只需要在当前类中提供一个公共代码即可,至于这个方法的具体实现,就交由子类去实现。比如现在有一个动物类Animal,该类中有一个eat()的方法,显然对于不同种类的动物来说,吃这个行为肯定是不一样的,最简单的种类来说,就是食草动物和食肉动物。这个时候,没有办法在类中的方法里去实现,因此只能将eat()的实现交由具体的子类。

2025-03-17 19:51:35 1320

原创 双指针算法------练习1

这道题其实本质上还是两数之和的问题,只不过之前是给了一个数组,然后从数组里去寻找两个数。现在是直接给了一个结果,没有给数组,那么如何确定两个指针指向的初始位置呢?第一个指针初始的位置毫无疑问是0,但是第二个指针初始的位置一时间可能想不出来。此时,我们把a放到最小,假设a是0,那么就是求。中的b,很简单,直接对c进行开方即可。所以第二个指针初始的位置即为。

2025-03-16 17:52:22 252

原创 Java学习------初识单例模式

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。这里主要是学习GOF设计模式。

2025-03-16 13:50:01 568

原创 Java学习------初识JVM体系结构

JVM对应的是一套规范,然后不同公司根据这个规范有着不同的实现。当然还有着很多的实现,感兴趣的可以去搜索了解一下。在这个网址中,可以对这些规范做个更进一步的了解。对于开发来说,下图中的运行时数据区需要着重的了解。

2025-03-16 13:34:33 1063

原创 双指针算法------同向双指针

由于要求最小子串,这个时候还需要继续将l向后移动,如果还是包含,更新此时的子串,然后再向后移动。如果l向后移动的时候发现此时窗口不包含子串了,这个时候就和上面步骤一样,需要将r向后移动,重复之前的一个步骤和思想。在开始时初始化两个指针l、r,然后r开始向后移动,这个时候l和r之间就形成了一个“窗口”,然后判断这个窗口中是否包含需要的字符串,如果不包含,这个时候r要继续向后移动,如果移动到某一个位置,窗口中包含了需要的字符,先记录一下此时的子串。这道题是困难题,我也是直接看的题解。

2025-03-15 19:56:24 311

原创 本地部署LLaMA-Factory

LLaMA-Factory是一个专注于大模型训练、微调、推理和部署的开源平台。这个平台的设计目标是简化大模型的训练流程,增强模型微调能力,优化推理和部署体验,以及促进社区协作。LLaMA-Factory支持多种模型类型,包括LLaMA、LLaVA、Mistral、Mixtral-MoE、Qwen、Yi、Gemma、Baichuan、ChatGLM、Phi等,并提供了多种训练算法、运算精度、优化算法、加速算子和推理引擎。

2025-03-14 19:28:57 1572

原创 双指针算法------快慢指针

这道题也是一道很经典的用双指针的题目,但是和我们之前的双指针有所不同,这道题需要使用的是快慢指针,两个指针需要以不同的速度向前。速度慢的指针每次移动一个位置,速度快的指针每次移动两个位置,如果这两个指针可以相遇的话,那就说明原链表中存在着环,因为如果没有环的话,速度不同的两个指针是永远也不会遇到的。

2025-03-14 17:46:22 325

原创 双指针算法------相向双指针

这里初始化两个指针p1,p2分别指向数组的最后一个元素,然后比较两个元素的大小关系,将较大的元素放入nums1的末尾,并逐步向前移动指针。这样做可以确保合并后的数组是有序的,并且不需要额外的空间来存储合并后的数组。但是这里还需要一个额外的指针来指向合并后数组的最后一个位置,这个指针是用于跟踪的,然后放入元素后再相应移动这个指针。

2025-03-13 18:58:03 214

原创 双指针算法------左右指针

双指针算法是一种在数组、链表等线性数据结构上进行操作的技术。双指针通常指的是在序列中使用两个指针,按照特定的规则移动指针,以达到解决问题的目的。在数组上使用的两个指针,一个在开始位置,一个在结束位置。

2025-03-12 18:31:18 400

原创 贪心算法------练习6

这个时候如果仅仅是这个判断是不够的,按照题意来说,如果nums[i] > num[i+1]时,那么nums[i] >=nums[i-1]也是必然的,这种时候有个特殊的例子,比如2,6,1,就需要将1变大,总结就是如果nums[i-1] > nums[i+1]时,就需要将nums[i+1]变大。要将数组变为非递减数列,即在下标i的元素大于下标为i+1的元素时,要把i的元素进行变小;

2025-03-11 19:54:54 306

原创 贪心算法------练习5

遍历到第三个元素时,第二个元素的值为1,小于list的长度,因此需要将[6, 1]放在索引为1的位置上,此时list的长度为3;后面的结果也是以此类推,如果list的长度大于第二个元素的值,那么就将这个元素放入索引为第二个元素值的位置。看了很多题解之后,发现对于这种整数对的形式,再加上需要排序的条件,原来通用的第一步就是先对其进行排序,排序的规则就是根据第一个元素正向排序,第二个元素反向排序;排序结果为:[[7, 0], [7, 1], [6, 1], [5, 0], [5, 2], [4, 4]]

2025-03-10 19:41:42 297

原创 贪心算法------练习4

刷了几道题之后,有时候虽然无法理解题目的意思,也无从下手,但是从示例中也可以稍微获取到一点思路。这个时候用到贪心就是所有上涨的日子都进行买卖,就可以获取到最大利润。所有下跌的日子都不进行买卖,就可以不亏损。第二种:连续价格上升,这个时候就可以在第一天买入,最后一天售出获得最大盈利;第一种:相邻两天的价格上升,这个时候买卖可以盈利;第三种:连续价格下跌,这个时候不买卖就算盈利。

2025-03-09 18:37:23 250

原创 贪心算法------练习3

在寻找下标的位置时,第一次访问到的下标即为开始和结束坐标,记为start, end,则片段区间为[start, end],后续进行遍历时,如果再次访问到这个字母的下标,则记为end1,此时就需要将原先的end更新为end1,如果后续再次遍历到这个字母,则需要继续将下标继续更新,直到遍历结束为止。题目虽然文字很少,但是却很绕,其实意思却很简单,就是如果在第一个片段中出现了字母a,那么在第二个片段就不能再出现。这样就可以保证,这个字母不会再出现在后续的片段之中。

2025-03-08 19:04:16 432

原创 贪心算法------练习2

首先先定义一个变量pos,将第一个区间的第二个元素的值赋给pos,然后对排序好的区间进行遍历,如果当前区间的第一个元素值小于pos,那么就说明处在交集中,箭就可以射中,如果当前区间的第一个元素大于pos,那么就说明当前这只箭的爆炸范围已经无法引爆,所以需要的箭的数量就要+1。最后,由于要求的是交集,因此在比较的时候,当i区间的第二个元素大于i+1区间的第二个元素时,我们就需要将i+1区间放在i区间之前,当i区间的第二个元素小于i+1区间的第二个元素时,我们就需要将i+1区间放在i区间之后。

2025-03-07 19:14:29 178

原创 Java学习------进制转换

二进制:顾名思义就是满二进一,在Java中如果要表示当前一个数为二进制,则需要在前面加上0b以区分。十进制:顾名思义就是满十进一。

2025-03-06 22:36:54 420

原创 贪心算法------练习1

【代码】贪心算法------练习1。

2025-03-06 19:27:02 214

原创 贪心算法------区间问题

以图中的区间集合为例,对区间的结束值进行排序,将区间结束值小的区间排在前面,大的排在后面。因为我们所求的是最多不重叠区间的数量,所以在排序时,将结束值小的放在前面,这样在选择的时候,区间才会尽可能的多。排序结束之后,将第一个区间的结束值记录为right,然后从第二个区间开始进行遍历,判断后续的每一个区间的结束值和rignt的大小关系,如果结束值大于等于right值,则将新的结束值赋值给right,并且数量count+1。对于每一个给定的区间集合里的元素,都有着最大最小值,那么就可以用一条数轴来放这些区间。

2025-03-05 21:27:57 242

原创 IDEA连接Gitee

1.1 访问官网,然后点击图中的按钮,进入下载界面。然后点击Click here to download即可下载。1.2 下载完成之后双击应用开始安装。

2025-03-05 19:30:38 702

原创 贪心算法------分配问题

题中的第二个条件:相邻两个孩子评分更高的会获得更多的糖果。孩子的得分在ratings中,现在假设是给序号为i的孩子分发糖果,这个孩子的得分为ratings[i],则相邻孩子的得分就为ratings[i-1]和ratings[i+1]。第一眼看到这个题目,也是无从下手,可能也是因为困难题的缘故吧,至于为什么一下从之前的简单题跳到了这个困难题,也是因为想着跟着那本书,慢慢的走下来。但是这道题特殊的地方就在于对于每一个孩子分配的糖果都是根据两边的孩子来的,所以就能理解了官方题解从两边开始遍历的思路了。

2025-03-04 20:02:15 235

空空如也

空空如也

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

TA关注的人

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