- 博客(43)
- 收藏
- 关注
原创 CC23-最长的连续元素序列长度
摘要:本文介绍了一种在O(n)时间复杂度内查找无序整数数组中最长连续序列长度的算法。算法使用哈希集合存储数组元素,通过遍历集合判断每个元素是否为连续序列起点,然后向后查找连续元素计算长度。代码实现包括边界处理、哈希集合初始化、连续序列查找和长度统计。时间复杂度为O(n)(每个元素最多访问两次),空间复杂度为O(n)(存储哈希集合)。示例输入[1000,4,2000,1,3,2]输出4,对应连续序列[1,2,3,4]。
2025-11-03 15:55:19
154
原创 CC21-包围区域
该问题要求将二维矩阵中被X完全包围的O区域填充为X。解题核心是识别并保留与边界相连的O区域。采用DFS或BFS方法:1)先遍历矩阵边界,标记所有边界O及其连通区域为临时字符#;2)然后将剩余的O(即被包围的)替换为X;3)最后将#恢复为O。两种方法的时间复杂度均为O(mn),空间复杂度DFS取决于递归深度,BFS取决于队列大小。关键点是通过逆向思维,先标记保留区域再处理被包围区域。
2025-10-19 18:14:18
248
原创 CC20-分割回文串
本文探讨了字符串回文分割问题的两种解法:深度优先搜索(DFS)和广度优先搜索(BFS)。DFS方法通过递归和回溯,从字符串起始位置尝试不同分割点,将回文子串加入路径,直到处理完整字符串;BFS方法则使用队列存储分割路径,预处理各位置的回文子串后,广度优先构建所有可能的分割方案。两种方法的时间复杂度均为O(N×2^N),但BFS空间复杂度更高(O(N×2^N))相比DFS的O(N)。文中提供了Java实现代码,并详细分析了算法流程和复杂度。
2025-10-18 17:46:14
366
原创 CC19-分割回文串-ii
本文介绍了一种动态规划方法来解决字符串最小回文分割问题。首先通过预处理构建二维数组判断子串是否为回文,然后使用一维dp数组记录前i个字符的最小分割次数。时间复杂度为O(n²),空间复杂度为O(n²)。该方法通过两次双重循环实现,第一次预处理回文状态,第二次计算最优分割次数,最终返回字符串的最小分割次数。
2025-10-18 17:07:16
314
原创 CC18 复制无向图
摘要: 本文实现了一个无向图的复制算法,采用BFS遍历结合哈希表存储节点映射关系。算法首先处理边界条件,然后初始化哈希表和队列,复制起始节点后开始BFS遍历。对于每个节点,复制其未被访问的邻居节点,并维护邻居关系。时间复杂度和空间复杂度均为O(N),其中N为节点数量。代码包含节点定义、核心复制逻辑及测试方法,适用于处理带自环的无向图复制场景。
2025-10-18 16:43:44
429
原创 CC17-加油站
本文解决环形加油站问题:给定n个加油站的汽油量gas和消耗量cost,判断是否存在起始点能绕行一周。采用贪心算法,先检查总油量是否足够(总油量≥总消耗),不足则直接返回-1。否则遍历计算当前油量,若当前油量为负则重置起点和油量。最终满足条件时返回起点编号,否则返回-1。算法时间复杂度O(n),空间复杂度O(1)。示例输入gas=[2,3,1],cost=[3,1,2]时,返回起始点1。
2025-10-17 17:25:48
494
原创 CC16-分糖果
摘要:该算法解决N个站成一排的小朋友按评分分糖果的问题,要求每个至少1颗糖果且高分者比相邻低分者糖果多。采用两次遍历的动态规划方法:第一次从左到右确保右边高分者糖果更多,第二次从右到左确保左边高分者糖果更多且取较大值。时间复杂度O(n),空间复杂度O(n)。示例输入[1,2,2]的最少糖果数为4。
2025-10-17 17:06:34
345
原创 CC14-出现一次的数字ii(含CC15)
摘要:题目要求在整型数组(其他元素出现三次)中找出唯一出现一次的数字。提供两种解法:1)哈希表法,统计频次后筛选,时间复杂度O(n),空间复杂度O(n);2)位运算法,逐位统计和对3取余确定目标数的二进制位,满足O(1)空间和O(n)时间。示例验证了两种方法的正确性,位运算通过32次遍历实现高效求解,适用于大规模数据。
2025-10-17 16:43:19
442
原创 CC12-拆分词句
本文介绍了使用动态规划解决字符串拆分问题的方案。通过定义dp[i]表示字符串前i个字符是否可被分割,初始化dp[0]为true,然后双重循环检查每个子串是否在字典中,最终确定整个字符串是否可分割。Java实现展示了具体算法,时间复杂度O(n²),空间复杂度O(n),经测试验证正确有效。该方法能高效判断字符串是否可拆分成字典中的单词序列。
2025-10-17 14:46:27
295
原创 CC10-判断链表中是否有环
本文介绍了使用快慢指针法判断链表是否有环的Java实现。通过定义slow和fast两个指针,分别以1步和2步的速度遍历链表,若两指针相遇说明有环,否则无环。文章包含代码实现和测试示例,证明该方法时间复杂度O(n),空间复杂度O(1),高效解决了该问题。
2025-10-16 17:45:12
160
原创 CC9-链表中环的入口结点
本文介绍了使用快慢指针法在Java中判断链表是否有环并找到环入口节点的方法。通过定义慢指针(每次1步)和快指针(每次2步),当两指针相遇说明有环,然后将快指针重置到链表头,两指针同速移动,再次相遇点即为环入口。代码实现包含链表节点类定义和环检测方法,时间复杂度O(n),空间复杂度O(1)。测试用例验证了算法的正确性,成功输出预期结果3。该方法高效地解决了链表环检测问题。
2025-10-16 17:38:54
699
原创 CC6-二叉树的后序遍历
本文介绍了使用Java递归实现二叉树后序遍历的方法。首先分析题目要求,明确后序遍历顺序为左子树-右子树-根节点。通过递归分解问题,依次处理左子树、右子树,最后记录根节点值。文中提供了完整的Java代码实现,包括TreeNode节点类定义、递归遍历方法和测试用例。测试结果[3,2,1]验证了代码正确性。该方案简洁高效地实现了二叉树的后序遍历功能。
2025-10-16 16:45:30
601
原创 CC5-链表的插入排序
本文介绍了使用插入排序算法对链表进行排序的方法。通过维护已排序子链表和虚拟头节点,逐个将未排序节点插入合适位置。算法步骤包括:初始化虚拟头节点,比较当前节点与已排序部分末尾节点值,决定直接后移或查找插入位置。代码实现展示了完整的链表节点类和排序方法,并通过示例30->20->40的排序过程进行说明,最终输出正确排序结果20->30->40。该算法时间复杂度为O(n²),空间复杂度O(1),适用于小规模链表排序。
2025-10-16 14:28:25
249
原创 CC4-链表排序
本文介绍了使用归并排序算法在O(nlogn)时间复杂度下对链表进行排序的解决方案。通过快慢指针分割链表,递归排序左右两部分后合并。代码实现了链表节点定义、分割、排序和合并的完整过程,并通过测试验证了算法正确性,成功将输入30->20->40排序为20 30 40。该方案满足题目要求的时间和空间复杂度限制。
2025-10-16 11:57:34
272
原创 CC3-多少个点位于同一直线
该文章描述了一个计算平面上最多有多少个点共线的问题及其Java实现方案。解题思路是通过枚举每个点,计算其与其他点的斜率,使用哈希表统计相同斜率的点数量,考虑重合点情况。代码包含Point类定义、核心maxPoints方法实现(处理特殊边界条件、斜率计算和统计)以及测试用例验证。测试结果显示算法能正确识别共线点,如示例1输出2,示例2输出3,自定义测试用例输出3(前三点共线)。该方案有效解决了平面点集共线数量统计问题。
2025-10-16 11:48:54
277
原创 CC2-后缀表达式求值
本文介绍了使用栈结构计算逆波兰式(后缀表达式)的方法。通过分析题目要求,阐述了栈的核心作用:遇到操作数入栈,遇到运算符则弹出两个操作数进行计算后重新入栈。文章详细说明了算法步骤,并提供了完整的Java代码实现,特别强调了减法和除法运算时操作数的顺序处理。代码通过三个测试用例验证了正确性,包括复合运算和单操作数情况。最后总结指出,栈的后进先出特性完美契合后缀表达式计算需求,这种方法在编译原理等领域具有广泛应用价值。
2025-10-15 22:37:47
417
原创 CC1-二叉树的最小深度
本文介绍了求解二叉树最小深度的递归方法。通过分情况处理空树、单侧子树和双侧子树,递归计算左右子树的最小深度并取较小值加1。给出了完整的Java代码实现,包括TreeNode类定义和递归函数run(),并验证了示例输入[1,2,3,4,5]的正确输出为2。该方法高效简洁,重点在于正确处理叶子节点定义(无左右子节点)的特殊情况,这种递归思路适用于各类树结构问题。
2025-10-15 22:23:28
1160
原创 第一章:CSS样式及基本选择器
我们要给元素(标签)添加样式,肯定要先把这个元素选出来才能添加,这个就叫选择器,用来选出特定的元素(标签)。本章节介绍了CSS的样式种类,优先级以及四个基本选择器,但仅凭四个基本选择器还不够用,下一章将介绍CSS的复合选择器以及选择器的优先级。
2025-01-15 15:29:22
1098
原创 第三章:HTML的字符实体,meta标签以及全局属性
本章节介绍了HTML4的字符实体,meta元信息和常用的全局属性。下一节将介绍HTML5新增的功能。更多详细代码可点击此处查看。
2025-01-13 15:39:16
1221
原创 第二章:HTML的常用标签
HTML是一种标记性语言,主要通过各种标签来呈现页面,不同标签有不同的语义和效果。注意:效果不重要,标签最重要的是语义,所有的效果都可以通过css进行修改,主要是为了方便爬虫、盲人阅读器等等的读取。本节介绍了HTML4的一些常用标签,更多标签可以在W3C上查看,这部分是HTML的十分基础的东西,下一节将介绍HTML的全局属性,字符实体以及meta元信息。
2025-01-12 17:21:17
1255
原创 第一章:走入HTML
HTML是一种超文本标记语言,我们可以通过HTML代码写出简单的网页,本节详细介绍了HTML的发展,功能以及基本的结构和开发工具。相信你对HTML已经有了初步的认识,后续将逐步介绍HTML的更多知识。
2025-01-11 20:38:51
1340
原创 Fibonacci数列(斐波那契数列或兔子数列)
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为:1、1、2、3、5、8、13、21、34……在数学上,这一数列以如下递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。那么如何使用C语言程序来输出斐波那契数列呢?下面给出了三种解决方案。
2024-11-21 22:08:10
1842
原创 循环结构程序设计
本节介绍了循环结构程序的设计,包括了三种循环语句及特点(while,for,do-while),break和continue语句,还分析了4个案例。
2024-11-20 23:03:25
1626
原创 二分查找算法
二分查找也称折半查找,是一种高效的查找方法,但是二分查找要求必须是有序的储存方式,所以在数组中查找某个数据时,使用该方法必须保证数组是有序的。它通过将空间划分为两个部分,每次只比较中间元素,直至找到查找目标的位置或者数组被找完。
2024-11-17 14:05:37
742
原创 排序算法——快速排序
快速排序的思想是分治法,将一个大问题分割成几个小问题解决,首先选择一个数作为分水岭,然后让比该数大的都在它的右边,比它小的都在它左边,将一个大问题分割成了两个问题,用同样的方法对两边分别操作,最后呈现出来的就是排好序的整体。
2024-11-15 23:45:02
1438
原创 排序算法——冒泡排序
冒泡排序是一种简单的排序算法,它通过从左往右依次遍历,比较相邻元素的大小,并根据需要交换它们的位置来排序数据,以升序为例,这个过程类似空中的泡泡,重量大的往下沉,重量小的往上浮,从而得名冒泡排序。这种排序方法的优点是思路简单,便于理解和编写,而且是直接对数组进行操作,节省内存;缺点是循环次数较多(需要排序n-1次),运行速度较慢。
2024-11-14 22:56:29
948
原创 C语言的概述及开发工具
C语言是一种较早的程序设计语言,诞生于1972年的贝尔实验室。1972 年,Dennis Ritchie 设计了C语言,它继承了B语言的许多思想,并加入了数据类型的概念及其他特性。尽管C 语言是与 UNIX 操作系统一起被开发出来的,但它不只支持UNIX。广泛应用于底层开发。C语言能以简易的方式编译、处理低级储存器。C语言是仅产生少量机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。
2024-11-11 14:31:46
1083
原创 第九章:Gitee码云
本章介绍了Gitee码云的操作以及IDEA集成Gitee,由于方法和GitHub一样,所以介绍的比较简略,详细可见第六章和第八章。
2024-11-10 21:41:23
1034
原创 第七章:IDEA集成Git
本章介绍了IDEA和Git的集成使用,IDEA功能十分强大,操作方便,学起来很快。今天就到这里了!下一章将介绍IDEA集成GitHub。
2024-11-08 17:58:27
3481
原创 第六章:GitHub的操作
本章将详细介绍上一章的团队协作过程,这一部分十分重要,大家认真学习,可以找几个小伙伴模拟一下过程。本章节详细介绍了github的操作方法,希望大家可以自己模拟一下这个过程,争取学会。好了,本章到这里就结束了,下一章将介绍IDEA集成Git。
2024-11-05 21:22:58
2549
原创 第五章:Git的团队协作机制
本章比较简单,主要是介绍团队内,团队间是如何协同工作的以及一些本地库和远程库,远程库和远程库之间的操作命令,这些命令具体如何操作在下一章介绍。下一章将介绍Github的操作以及远程库的创建。
2024-11-04 13:44:26
310
原创 第四章:Git的分支操作
在版本控制过程中,同时推进多个任务,程序员可以创建单独的分支,意味着程序员将自己的工作从主线上分离出来,在各自的分支工作。而不影响主线的运行。例如某款软件正在运行,有一天程序员A想给软件添加一个A功能,程序员B想给软件添加一个B功能,那么他们可以各自创建一个分支,然后在各自的分支上写代码,测试完之后再合并到原来的主线上即可。这样就你可以保证一切工作有序的进行,即使某个程序员把代码写毁了,也不怕,因为他是在自己的分支上工作的,把该分支删除即可,不会影响原来主线的运行。好了,今天到这里就结束了!
2024-11-03 19:45:23
1272
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅