- 博客(69)
- 收藏
- 关注
原创 【DFS解决floodfill算法】岛屿数量
题目要求在给定的二维矩阵中,统计由相邻陆地('1')组成的岛屿数量,其中相邻指水平或垂直方向相连。通过深度优先搜索(DFS)解决:遍历矩阵,每发现未被访问的陆地时标记为已访问并计数,然后递归搜索其四周相邻陆地。全局变量记录矩阵信息及访问状态,方向数组简化四向搜索。无需回溯或剪枝,当所有陆地访问完毕即返回岛屿总数。代码实现中,主函数初始化并遍历矩阵,DFS函数处理相邻陆地标记,确保每个岛屿只统计一次。
2026-06-05 19:39:04
232
4
原创 【DFS解决floodfill算法】图像渲染
本文介绍了使用深度优先搜索(DFS)实现洪水填充(floodfill)算法来解决图像渲染问题。算法从给定起始位置开始,递归搜索相邻且像素值相同的区域,并将其修改为目标颜色。关键点包括:判断起始像素与目标颜色是否相同以避免无效操作,使用全局变量简化递归参数,通过方向数组实现四向搜索,以及无需回溯和剪枝的特性。代码实现清晰展示了DFS的核心逻辑,包括边界检查、颜色判断和递归调用。该算法能有效处理二维矩阵中的连通区域填充问题。
2026-05-26 19:25:12
435
7
原创 【递归算法】不同路径Ⅲ
题目要求在给定的二维网格中,从起点到终点的所有路径必须经过所有无障碍方格且不重复。采用深度优先搜索(DFS)算法,先统计无障碍方格总数,再从起点开始递归搜索四个方向。当到达终点时检查路径步数是否等于总步数,相等则计入有效路径。通过回溯和访问标记确保不重复访问。最终返回所有有效路径的数量。
2026-05-18 21:02:44
1052
6
原创 【递归算法】黄金矿工
本文介绍了LeetCode 1219题"黄金矿工"的解题思路。题目要求在给定的m×n网格中,按照特定规则开采黄金,寻找收益最大的路径。文章详细解析了题目要求,通过示例展示了决策过程,并提出了基于深度优先搜索(DFS)的解决方案。算法使用回溯法遍历所有可能的开采路径,维护全局变量记录最大值。代码实现中包含了网格遍历、DFS函数设计、回溯处理和边界条件判断等关键步骤,最终返回所有路径中的最大黄金收益。该解法时间复杂度为O(mn*4^k),其中k为路径平均长度。
2026-05-12 20:58:11
398
4
原创 【递归算法】单词搜索
题目要求在给定的二维字符矩阵中查找是否存在指定的字符串,只能通过相邻方格(上下左右)且不能重复使用同一方格。采用深度优先搜索(DFS)策略,通过回溯法遍历所有可能的路径。 算法核心步骤: 遍历矩阵,找到与目标字符串首字符匹配的位置 使用DFS从该位置开始搜索后续字符 维护访问标记数组避免重复使用 通过方向数组处理四个相邻位置 找到完整字符串返回true,否则回溯并继续搜索 时间复杂度:O(mn*3^L),其中mn为矩阵大小,L为字符串长度。空间复杂度:O(mn)用于存储访问标记。 该方法通过系统地探索所有可
2026-05-07 22:04:15
511
20
原创 【MySQL数据库】数据库操作及数据类型
本文介绍了MySQL数据库的基本操作,主要包括SQL语言分类和常用数据库操作命令。SQL语言分为DDL(数据定义语言)、DML(数据操纵语言)和DCL(数据控制语言)三大类,分别用于数据结构维护、数据操作和权限管理。文章详细演示了查看数据库(SHOW DATABASES)、创建数据库(CREATE DATABASE)等基础操作,特别说明了使用反引号处理关键字作为数据库名称的情况,以及通过LIKE子句进行模糊查询的方法。此外,还介绍了创建数据库时可选的字符集和排序规则设置。这些内容为初学者提供了MySQL数据
2026-05-06 19:34:09
507
19
原创 【递归算法】解数独
这篇文章详细讲解了如何解决数独问题。主要内容包括: 数独规则分析:每行、每列和每个3x3宫格内数字1-9不能重复 使用三个布尔数组(行、列、宫格)来记录数字出现情况 基于回溯算法的解决思路: 通过DFS遍历每个空格 尝试填入1-9的数字,检查合法性 合法则递归继续填下一个空格 不合法则回溯并尝试其他数字 提供了完整的Java代码实现,包括初始化状态记录和DFS解法 文章强调先完成"有效的数独"作为前置题目,并给出了详细的算法解析和代码注释,帮助理解回溯法在解决数独问题中的应用。
2026-04-25 20:25:30
602
10
原创 【递归算法】N 皇后
本文介绍了解决N皇后问题的回溯算法实现。N皇后问题要求在n×n棋盘上放置n个皇后,使其互不攻击。文章通过决策树分析剪枝策略,使用三个布尔数组分别记录列、主对角线和副对角线的皇后位置情况。关键点在于利用数学坐标关系判断对角线冲突:主对角线满足y-x=定值,副对角线满足y+x=定值。代码实现采用深度优先搜索,逐行尝试放置皇后,满足条件时递归处理下一行,否则回溯。最终将有效解转换为字符串列表返回。该算法通过剪枝有效减少了不必要的搜索,提高了效率。
2026-04-22 18:53:24
517
12
原创 【网络编程】UDP/TCP 协议套接字编程
本文介绍了网络编程的基本概念和Java中的Socket套接字编程。主要内容包括: 网络编程基础:解释了网络编程是通过不同进程实现网络通信/数据传输,介绍了发送端/接收端、请求/响应、客户端/服务端等基本概念。 Socket套接字分类:分为流套接字(TCP协议)、数据报套接字(UDP协议)和原始套接字,重点介绍了TCP和UDP协议的特点。 Java数据报套接字(UDP)通信模型:详细描述了UDP协议的无连接通信流程,包括DatagramSocket和DatagramPacket类的使用方式。 Java流套接字
2026-04-21 15:33:04
572
8
原创 【递归算法】优美的排列
本文介绍了如何通过回溯算法解决LeetCode上的"优美排列"问题。题目要求在[1, n]区间内构造排列,使得每个位置的数字满足特定整除条件。算法采用深度优先搜索策略,使用决策树枚举所有可能排列,并通过剪枝优化效率。关键点包括:使用布尔数组记录数字使用状态,在递归过程中检查条件并回溯恢复现场,当完成有效排列时统计结果。该解法时间复杂度为O(n!),适用于小规模输入,展示了回溯算法在排列组合问题中的典型应用。
2026-04-19 12:12:22
1104
6
原创 【递归算法】字母大小写全排列
本文解析LeetCode题目《字母大小写全排列》,要求生成给定字符串所有字母大小写组合。通过决策树模型展示递归过程:遍历字符串,遇到字母时分别添加大小写形式,数字则直接添加。使用回溯法维护全局变量ret(结果集)和path(当前路径),递归出口为遍历完字符串时保存结果。提供两种Java实现:版本一显式处理大小写转换,版本二封装转换函数。两种方案均通过回溯恢复现场确保状态正确,最终返回所有可能组合。
2026-04-17 21:02:30
421
6
原创 【递归算法】组合总和
本文讨论了LeetCode上组合总和问题的两种回溯解法。第一种解法通过深度优先搜索枚举所有可能的组合,使用剪枝条件避免重复结果(如[2,3]和[3,2]),并通过全局变量记录路径和结果。第二种解法采用分层策略,每层决定是否选择当前数字及其数量,通过循环控制数字选择次数。两种方法都利用了回溯机制恢复现场,确保正确性。最终代码展示了如何在Java中实现这两种策略,其中关键点包括递归终止条件、剪枝处理以及回溯时的路径管理。
2026-04-16 20:18:03
402
6
原创 【网络原理】初识相关概念
网络发展史与通信基础摘要 网络发展从独立计算机演变为互联共享数据的局域网(LAN)和广域网(WAN)。局域网通过网线、集线器或交换机组建,广域网通过路由器连接多个局域网形成更大范围(如互联网)。 网络通信核心要素 IP地址:定位主机的网络位置(如快递地址)。 端口号:标识主机中的具体进程(如住户门牌)。 协议:规定数据格式和通信规则(如暗号约定)。 五元组(源/目的IP、端口号+协议)唯一标识通信链路。 分层模型 OSI七层为理论框架,实际采用TCP/IP五层模型(物理层→应用层),每层专注特定功能(如传输
2026-04-16 16:01:15
626
5
原创 【递归算法】目标和
本文解析了LeetCode上的目标和问题,要求在非负数组的每个数字前添加“+”或“-”,使得总和等于目标值。通过决策树和深度优先搜索(DFS)实现组合枚举,分别讨论了全局变量和函数参数两种回溯方法。核心思路是递归遍历所有可能的符号组合,统计符合条件的路径数。代码示例展示了两种实现方式,并解释了回溯与剪枝的细节。最终,该问题转化为二叉树路径搜索,时间复杂度为指数级,但通过回溯优化避免了重复计算。
2026-04-12 16:59:47
669
13
原创 【递归算法】组合
本文介绍了使用回溯算法解决组合问题(LeetCode 77题)的方法。通过决策树分析,展示了如何从区间[1,n]中选择k个不重复数字的所有组合。关键点在于递归过程中通过pos参数控制数字选择范围以避免重复组合。文章详细讲解了回溯算法的实现步骤,包括全局变量设置、dfs函数设计、剪枝优化和递归出口处理,并提供了Java代码实现及优化版本。最终方案通过回溯有效生成了所有符合条件的数字组合。
2026-04-11 15:34:46
1088
2
原创 【递归算法】括号生成
本文探讨了LeetCode上生成有效括号组合的问题(题目链接:22. Generate Parentheses)。题目要求生成所有由n对括号组成的有效组合。通过深度优先搜索(DFS)和剪枝策略,决策树分析展示了如何避免无效组合(如右括号先于左括号出现)。全局变量记录路径和括号数量,递归函数根据剪枝条件(左括号数≤n且右括号数<左括号数)动态生成组合。代码实现中,回溯恢复现场确保正确性,最终当右括号数等于n时保存结果。该算法高效筛选所有合法组合,时间复杂度为卡特兰数O(4^n/√n)。
2026-04-11 10:26:43
793
3
原创 【递归算法】电话号码的字母组合
本文介绍了如何通过回溯算法解决电话号码字母组合问题。给定数字字符串,需要返回所有可能的字母组合。算法使用决策树进行深度优先搜索,通过字符串数组模拟哈希表存储数字与字母的映射关系。递归函数逐个处理数字,遍历对应字母并回溯,最终将所有组合存入结果列表。时间复杂度为O(3^N*4^M),其中N和M分别对应3字母和4字母的数字个数。文章包含详细算法解析和Java代码实现。
2026-04-07 11:40:57
514
2
原创 【笔试强训】Day1
本文介绍了三个算法题目的解题思路与代码实现。第一题通过枚举和数字拆分统计区间内数字2的出现次数;第二题利用哈希表或数组模拟哈希求两个数组的交集;第三题使用栈结构实现相邻相同字符的消除功能。每个题目均包含详细解析、算法原理说明和Java代码实现,涵盖了数字处理、哈希查找和栈应用等常见编程技巧,适合算法初学者参考学习。
2026-03-31 15:51:50
384
9
原创 【JavaEE】Spring Boot 快速上手
本文介绍了使用Spring Boot和Maven开发Java Web应用的基础知识。首先说明了Spring Boot如何简化传统Spring应用的配置流程,随后详细讲解了Maven的核心功能,包括项目构建和依赖管理。文章重点演示了Maven依赖配置方法、依赖传递机制以及如何解决依赖冲突,并介绍了Maven Helper插件的使用。此外,还解释了Maven仓库的工作原理,包括本地仓库配置和中央仓库访问。最后,文章指导读者完成了一个简单的Spring Boot Web项目创建过程,实现"Hello W
2026-03-26 22:57:24
1758
113
原创 【递归算法】全排列 Ⅱ
本文解析了LeetCode上"全排列II"问题,要求在包含重复数字的数组中返回所有不重复的全排列。通过分析决策树,指出需在标准全排列解法基础上增加剪枝策略,避免重复结果。详细讲解了两种剪枝思路:一种是基于合法条件(数字未使用且满足特定条件)进入递归;另一种是基于不合法条件(数字已使用或与前一个重复数字冲突)跳过递归。提供了对应的Java代码实现,并强调了对数组排序的重要性。最后总结了两种剪枝方法的等价性,为处理重复元素的全排列问题提供了清晰解决方案。
2026-03-26 15:08:36
566
44
原创 【多线程】常见的锁策略及 synchronized 的原理
本文系统梳理了Java并发编程中的常见锁策略。首先介绍了乐观锁与悲观锁的区别及其适用场景,然后分析了轻量级锁与重量级锁的实现机制及性能差异。文章详细探讨了自旋锁与挂起等待锁、公平锁与非公平锁、可重入锁与不可重入锁、读写锁等不同锁策略的特点。针对synchronized的实现原理,文章阐述了其从无锁到偏向锁、轻量级锁再到重量级锁的升级过程,以及锁消除和锁粗化等优化技术。最后提供了多个锁相关的面试题解答,帮助读者深入理解锁策略在实际开发中的应用。
2026-03-24 21:44:47
583
34
原创 【递归算法】找出所有子集的异或总和再求和
本文介绍了LeetCode题目《所有子集异或总和之和》的解法。通过分析题目要求,提出三步解题思路:找出所有子集、计算子集异或值、求和异或值。采用决策树模型设计回溯算法,利用全局变量path和sum分别记录子集异或值和总和。详细讲解了dfs函数实现、回溯处理和递归出口等关键步骤,并给出Java代码实现。该方法通过异或运算特性简化回溯操作,高效计算所有子集的异或总和。
2026-03-24 15:09:21
606
51
原创 【递归算法】子集
题目要求返回不含重复数字数组的所有子集,包括空集。采用递归法解决,有两种思路:一是基于每个数字的“选与不选”构建决策树,递归遍历所有可能;二是按子集元素个数分类,通过循环和回溯生成所有组合。两种方法均使用全局变量记录结果和路径,并通过回溯恢复现场。代码实现简洁,时间复杂度为O(2ⁿ),空间复杂度为O(n)。
2026-03-23 20:07:12
437
12
原创 【递归算法】全排列
本文解析了LeetCode全排列问题,通过递归回溯法生成所有不重复排列。算法使用决策树模型,通过标记数组避免重复选择,递归过程中维护路径列表,当路径长度等于输入数组长度时保存结果。关键点包括:递归出口判断、数字状态标记与恢复、回溯时的剪枝处理。代码实现采用全局变量记录结果和路径,通过深度优先搜索(DFS)遍历所有可能排列,最终返回符合条件的二维结果数组。
2026-03-22 11:20:14
484
9
原创 【网络原理】HTTP 协议和 HTTPS 协议
HTTP协议是互联网数据传输的基础协议,采用客户端-服务器一问一答模式。通过Fiddler抓包工具可以查看HTTP请求和响应的文本格式结构:请求包含首行、请求头、空行和正文;响应包含状态行、响应头、空行和正文。URL定位网络资源,包含协议、域名、路径等元素,特殊字符需进行URL编码。HTTPS在HTTP基础上增加SSL/TLS加密层保障安全。
2026-03-17 17:11:07
2257
35
原创 【递归算法】二叉树的所有路径
摘要: 本文解析了LeetCode题目"二叉树的所有路径",要求输出从根节点到每个叶节点的路径。通过前序遍历和回溯算法实现,使用全局变量记录路径和结果,并处理回溯时的还原问题。改进方案将全局变量改为局部变量以避免还原错误,同时引入剪枝优化递归效率。代码展示了Java实现,包括剪枝处理。
2026-02-14 11:39:20
997
32
原创 【递归算法】二叉搜索树中第K小的元素
本文介绍了在二叉搜索树(BST)中查找第K小元素的两种解法。第一种解法利用BST中序遍历的有序性,通过全局变量count记录当前遍历次序,当count减至0时记录当前节点值。第二种解法在第一种基础上添加剪枝优化,当找到目标元素后直接终止后续遍历。两种方法都采用递归实现中序遍历,时间复杂度为O(n),空间复杂度为O(h)(h为树高)。剪枝优化版本能提前终止遍历,效率更高。文章通过示例详细说明了算法流程,并提供了Java代码实现。
2026-02-07 16:11:56
738
15
原创 【多线程】多线程四个案例精讲
单例模式是一种保证系统实例唯一性的设计模式,通过私有化构造方法和提供全局访问点实现。主要分为饿汉模式(类加载时立即创建实例)和懒汉模式(首次调用时延迟创建)。饿汉模式线程安全但可能造成资源浪费,懒汉模式更高效但需解决多线程安全问题。多线程环境下可使用双检锁+volatile方案确保懒汉模式的线程安全,既保证效率又防止指令重排序。两种模式的核心区别在于初始化时机和资源开销,适用于不同场景需求。
2026-02-05 22:26:45
1150
53
原创 【递归算法】验证二叉搜索树
本文介绍了验证二叉搜索树(BST)的两种解法。解法一通过中序遍历存入数组检查有序性,但因内存消耗大被否决。解法二采用全局变量记录前驱节点值,递归判断左右子树和当前节点是否符合BST定义,并通过剪枝优化提前终止无效递归。关键点在于初始化前驱值为极小值(Long.MIN_VALUE)以避免边界问题,最终实现高效验证。
2026-01-30 23:19:01
801
7
原创 【递归算法】二叉树剪枝
本文介绍了二叉树剪枝问题的递归解法。题目要求删除所有不包含1的子树,即子节点全为0的子树。算法采用后序遍历思想:先递归处理左右子树,再根据当前节点的值和子节点情况判断是否需要删除。若当前节点值为0且左右子节点均为空,则删除该节点。代码实现简洁,递归出口处理空节点,通过后序遍历自底向上判断每个节点是否需要保留。时间复杂度为O(n),空间复杂度取决于递归深度。
2026-01-29 11:55:19
620
5
原创 【递归算法】求根节点到叶节点数字之和
本文介绍了求二叉树根节点到所有叶节点路径数字之和的算法。通过递归遍历每个节点,将当前路径数字乘以10加上节点值得到新数字。对于叶节点直接返回该数字,非叶节点则递归处理左右子树并累加结果。关键点在于递归前计算新数字,并处理空子节点情况。最终代码简洁高效,时间复杂度为O(n)。
2026-01-28 11:25:30
373
6
原创 【递归算法】计算布尔二叉树的值
本文介绍了如何计算布尔二叉树的值。通过递归后序遍历的方式,先处理左右子树,再根据当前节点的值进行逻辑运算:若节点值为2执行OR运算,为3执行AND运算。叶子节点直接返回其布尔值(0为false,1为true)。算法时间复杂度为O(n),空间复杂度为O(h),其中n是节点数,h是树高度。该方法简洁高效地解决了布尔二叉树的求值问题。
2026-01-26 23:13:25
485
18
原创 【Java】数据类型,运算符和方法重点总结
Java数据类型分为基本类型和引用类型。基本类型包括四类八种:整型(byte,short,int,long)、浮点型(float,double)、字符型(char)和布尔型(boolean),各有固定大小和取值范围。引用类型存储地址而非值,包括字符串、包装类(如Integer)和BigDecimal等。包装类通过装箱/拆箱实现与基本类型的转换。BigDecimal用于精确计算,避免浮点数精度问题。数据类型转换需注意范围,大转小可能丢失精度或溢出。基本类型是Java基础,理解其特性对编程至关重要。
2026-01-26 20:37:53
1486
30
原创 【递归算法】快速幂解决 pow(x,n)
摘要: 题目要求实现计算x的n次幂的函数。当n为负数时,利用x⁻ⁿ=1/xⁿ转换;注意n可能为-2³¹,直接转换会导致溢出。解法一暴力循环时间复杂度O(n),效率低。更优的解法二采用快速幂算法(递归实现),通过分治思想将问题分解为xⁿ/2的子问题,根据n的奇偶性合并结果,时间复杂度O(logn)。代码实现时需处理n的正负情况,递归出口为n=0时返回1。
2026-01-25 15:27:14
383
15
原创 【Java】深入理解Java语言的重要概念
Java是一门面向对象的编程语言,由Sun公司于1995年正式发布,其设计理念源于对C语言的改进,摒弃了多继承和指针等复杂概念,实现了功能强大与简单易用的结合。作为静态面向对象编程语言的代表,秉承着 “Once write, Run anywhere(一次编译,到处运行)” 的理念,Java通过JVM(Java虚拟机)实现跨平台运行,具备分布式、健壮性、安全性、多线程等特性,支持桌面应用、Web应用和嵌入式系统开发。
2026-01-23 17:18:36
1291
33
原创 【多线程】并发安全
本文主要探讨了Java多线程编程中的线程安全问题及其解决方案。首先通过共享变量自增操作的案例展示了线程安全问题的表现,分析了原子性、可见性和有序性三大原因。重点介绍了synchronized关键字实现原子性加锁,以及volatile关键字解决可见性问题的方法。文章还深入讨论了死锁的形成条件,包括互斥、不可剥夺、持有等待和循环等待四个必要条件,并提出了通过调整加锁顺序和避免嵌套加锁来预防死锁的策略。最后,通过代码示例演示了如何正确使用这些技术来确保线程安全。
2025-12-13 16:00:44
2632
152
原创 【多线程】Thread 类中线程的状态
如果线程的状态是 TIMED_WAITING 或者 WAITING,就得考虑一下是不是代码中某个方法产生了线程等待且没有及时将线程显式唤醒;Java 为了能够调度操作系统的线程重新封装了一个专门用于管理线程调度的 Thread 类,同时也给线程的状态重新封装。如果线程的状态是 RUNNABLE,那说明线程本身没有问题,就得考虑一下是不是代码中的某些逻辑条件没有按预期触发。小编认为,理解线程状态 并 懂得查看和分析线程状态 是调试多线程程序的重要技能之一。3. 再看看线程的调用栈,找到出现问题的具体代码行。
2025-12-09 15:33:01
689
61
原创 【多线程】Thread类及常用方法
Thread 类对象是用来描述一个线程执行流的,每一个线程都有唯一的 Thread 类对象与之对应,而 JVM 会将这些 Thread 类对象组织起来用于线程调度和线程管理。在上面的代码中,我们通过创建继承Thread类的子类MyThread来创建一个线程并运行,与此同时,main方法中的主线程也在运行,这就形成了一个“并发”执行的多线程程序。非后台线程其实就是我们所创建的线程(包括主线程),而后台线程则是 JVM 在执行进程时的一些自带线程,当进程结束(非后台线程全部结束),后台进程也就结束了。
2025-12-08 17:32:33
1191
42
原创 【多线程】进程和线程的区别与联系
进程是操作系统对正在运行的程序的一种抽象,也可以说进程就是程序的一次运行过程。进程是操作系统资源分配的基本单位。
2025-11-25 15:48:22
1287
69
原创 【优选算法】双指针算法
常见的双指针有两种形式:对撞指针和快慢指针。这道题目的特点是数组分块,因此以后我们刷题时遇到类似题目时,可以采用此题的算法思路结合题目具体细节来解决问题。这道题目需要转变一下思路,既然从前往后行不通,那就从后往前。其原因就是按原来的方法会有数据被覆盖,因此当以后遇到类似的题目,我们可以采用这道题目的思路。本题的特点是出现循环、重复某个操作,因此采用快慢指针的方法来解决,以后遇到此类相似问题,我们也可以采用这种算法思路来解决。这道题目使用对撞指针。
2025-11-24 11:43:27
1522
48
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅