- 博客(90)
- 问答 (2)
- 收藏
- 关注
原创 【动态规划】01背包与完全背包问题详解,LeetCode零钱兑换II秒解,轻松解力扣
01背包问题动态规划解法 本文介绍了01背包问题的动态规划解决方案。背包容量为w,有n件物品,每件物品有重量和价值,且只能使用一次。通过构建二维dp数组,其中dp[i][j]表示前i件物品放入容量j背包的最大价值。递推公式为:dp[i][j] = max(不放入当前物品的价值,放入当前物品的价值)。初始化时,背包容量为0时价值均为0。遍历顺序可先物品后容量或反之,最终得到最大价值总和。该方法将暴力解法的指数复杂度优化为多项式时间复杂度。
2025-12-21 11:00:47
1498
67
原创 【Java】synchronized关键字详解:从字节码到对象头与锁升级
synchronized底层原理详解 synchronized实现同步的核心机制是通过对象监视器(Monitor)实现的,主要包含以下关键点: 字节码层面 同步代码块编译后会生成monitorenter和monitorexit指令 同步方法通过ACC_SYNCHRONIZED标志实现 对象头与Monitor 每个对象关联一个Monitor对象 对象头中的Mark Word存储锁状态信息 Monitor包含Owner(持有线程)、EntryList(阻塞队列)和WaitSet(等待队列) 锁升级优化 无锁 →
2025-11-30 09:30:00
1852
81
原创 【Spring进阶】Spring IOC实现原理是什么?容器创建和对象创建的时机是什么?
Spring Bean生命周期解析 Spring容器管理Bean的完整生命周期主要包括以下几个关键阶段: 容器初始化:通过ApplicationContext或BeanFactory加载配置,预注册Bean定义 BeanDefinition生成:解析XML/注解配置,生成包含元数据的Bean蓝图 实例化:通过反射创建Bean对象 依赖注入:按构造器/Setter/字段方式注入依赖 初始化:执行Aware接口回调、init-method等初始化逻辑 缓存管理:将完全初始化的单例Bean加入缓存池 Applic
2025-11-23 14:06:38
1977
103
原创 SpringBoot YAML 配置读取机制 + 数据库自动初始化原理
SpringBoot通过YAML配置自动初始化数据库的核心机制是配置绑定和自动配置。配置绑定通过@ConfigurationProperties将YAML中的数据库配置映射到Java类,如DataSourceProperties;自动配置则通过spring-boot-starter-jdbc等Starter依赖触发,自动创建DataSource和SqlSessionFactory。整个过程分为两步:1)加载YAML配置并绑定到Java实体类;2)利用自动配置类将绑定后的配置注入到Spring容器,完成数据库
2025-11-17 18:19:00
2813
98
原创 什么是约定优于配置?自动配置的原理是什么?一文搞懂SpringBoot底层启动流程
本文介绍了SpringBoot自动配置类的原理及实现机制。自动配置类基于项目依赖的jar包实现"开箱即用"功能,核心是通过@EnableAutoConfiguration注解导入配置选择器,读取META-INF/spring.factories文件中的配置类(SpringBoot3.0后改用新格式配置文件)。通过对比传统Spring整合Mybatis的繁琐配置(需要手动配置实体类、Mapper接口、资源文件、Mybatis配置文件等),突显了SpringBoot自动配置的优势:减少样板代
2025-11-15 09:15:00
1492
66
原创 如何在实验室服务器上搭建python虚拟环境?安装conda并配置虚拟环境
本文介绍了在Linux服务器上配置GPU开发环境的完整流程。首先通过lspci命令查看GPU设备信息,然后安装Anaconda并创建Python 3.12虚拟环境。详细说明了环境激活/退出、查看和删除虚拟环境的命令,最后验证PyTorch的CUDA可用性。文章以MOTIP论文复现为例,提供了从基础环境搭建到深度学习框架验证的完整指南,适合需要在服务器上配置GPU计算环境的开发者参考。
2025-11-09 09:00:00
2804
81
原创 聊聊JDK动态代理和CGlib动态代理,AOP代理机制是怎么回事?代理模式详解
摘要: 代理模式通过引入代理对象间接访问目标对象,控制访问并扩展功能。分为静态代理(手动增强方法,灵活性差)和动态代理(运行时生成代理类)。静态代理需为每个目标类单独创建代理类,动态代理则更灵活,包括JDK动态代理(基于接口)和CGLIB动态代理(直接代理类)。示例展示了静态代理的实现步骤,动态代理通过运行时动态生成字节码实现高效扩展。
2025-11-06 17:03:15
1777
74
原创 选 Redis Stream 还是传统 MQ?队列选型全攻略(适用场景、优缺点与实践建议)
这篇文档详细探讨了使用Redis作为消息队列的适用性,分析了Redis的List、Pub/Sub和Stream三种数据结构在队列场景下的特点和限制,并与专业的中间件如Kafka和RabbitMQ进行了对比。文档指出,虽然Redis轻量易用,但在数据持久化和消息积压处理方面存在局限,而专业的消息队列中间件在可靠性和扩展性方面表现更优,但运维更为复杂。最终,文档强调技术选型不仅要考虑技术层面,还要考虑团队的运维能力和资源。
2025-11-02 09:00:00
2681
103
原创 ReentrantLock 加锁与解锁流程详解(源码分析,小白易懂)
摘要: 本文详细解析了ReentrantLock的加锁解锁机制。加锁时,成功则修改state为1并设置独占线程;失败则构建Node队列,线程进入阻塞等待。解锁时,释放锁后唤醒队列中的等待线程,新线程可能通过非公平竞争抢占锁。整个过程涉及tryAcquire、addWaiter、acquireQueued等关键步骤,以及waitStatus状态变化,展现了ReentrantLock底层AQS实现的核心原理。
2025-10-30 12:55:12
1081
80
原创 LabelMe的安装、实例分割数据集、数据格式转换(VOC转yolo)并划分 详细教程
本文介绍了数据标注工具LabelMe的安装与使用,以及将VOC格式数据集转换为YOLO格式的方法。主要内容包括:1)通过Anaconda安装LabelMe并启动标注界面;2)使用多边形工具进行目标标注;3)提供Python脚本实现VOC到YOLO格式的转换,包括类别映射和边界框坐标转换;4)支持后续按比例划分训练集、验证集和测试集。文中给出了具体操作步骤和代码示例,并提示用户需要根据实际数据集调整路径和类别映射关系。该流程适用于计算机视觉任务的标注数据准备。
2025-10-28 20:29:03
1099
46
原创 SpringMVC入门:配置、映射与参数处理
这篇文章介绍了SpringMVC框架的基本概念和入门案例的实现步骤。 SpringMVC概述:SpringMVC是基于MVC设计理念的轻量级Web框架,是当前主流的MVC框架之一,能够简化Web开发中的请求处理、响应处理和页面跳转等操作。 入门案例实现: 导入相关依赖(Servlet、JSP、SpringMVC、Jackson等) 配置web.xml文件,设置DispatcherServlet和字符编码过滤器 创建SpringMVC配置文件,配置组件扫描和消息转换器 创建测试用JSP页面 编写Control
2025-10-26 15:44:50
1269
76
原创 Spring AOP:注解配置与XML配置双实战
这篇文章系统性地讲解了Spring AOP(面向切面编程)。核心在于通过注解(如@Aspect)或XML配置,在不修改原始代码的情况下,为方法动态添加统一功能(如日志、事务、加密等)。文章详细介绍了如何定义切点来定位目标方法,以及五种通知类型(如@Before、@Around)来实现增强逻辑。此外,还深入剖析了其底层原理——基于JDK和Cglib的动态代理,并提供了完整的实战案例,帮助读者从概念到应用全面掌握Spring AOP。
2025-10-24 12:07:01
1776
80
原创 Spring注解开发:@Component/@Autowired/@Value详解与实践
Spring 注解开发摘要 Spring 提供了多种注解来简化配置管理,替代传统的 XML 配置方式。核心注解包括: 组件扫描:通过 @ComponentScan 开启,指定扫描包路径,自动识别带注解的类。 IOC 相关: @Component:通用组件标识 @Controller/@Service/@Repository:分层语义化注解 DI 相关: @Value:直接属性注入,支持基本类型和 SpEL 表达式 @Autowired:自动注入同类型对象 @Qualifier:配合 @Autowired 指
2025-10-23 08:30:00
746
31
原创 Spring入门使用:IOC控制反转与DI依赖注入详解
本文介绍了Spring框架的核心概念IOC(控制反转)和DI(依赖注入)。IOC将对象控制权交给Spring容器,通过XML配置实现对象管理;DI则通过setter或构造方法注入依赖对象。文章详细演示了Spring的配置步骤、Bean属性设置及依赖注入方式,包括单例/多例作用域配置和引用类型的注入。通过示例代码展示了如何利用Spring简化JavaEE开发,实现对象间的解耦和灵活管理。
2025-10-21 09:00:00
1137
36
原创 详解Redis锁误删、原子性难题及Redisson加锁底层原理、WatchDog续约机制
本文探讨了Redis分布式锁的实现及其潜在问题。首先分析了基本的SETNX加锁命令可能存在的误删问题(线程A超时释放锁后被线程B获取,而线程A后续操作误删线程B的锁)。解决方案是通过为每个锁添加唯一标识(UUID+线程ID组合),并在删除时进行验证。针对原子性问题,文章提出使用Lua脚本保证判断锁标识和释放锁的原子性操作。 重点介绍了Redisson的分布式锁实现机制: 通过Lua脚本执行原子性加锁/释放操作 采用"看门狗"机制自动续约(默认每10秒续期30秒) 支持可重入锁和不同租期设
2025-10-18 12:16:35
1173
94
原创 【深度学习】手把手教你玩转YOLOv8:训练自己的目标检测模型
本文介绍了YOLOv8目标检测模型的环境配置与数据集准备流程。首先需要安装PyTorch、CUDA等通用环境和ultralytics专用环境,然后下载YOLOv8项目。针对VOC格式数据集,提供了转换脚本将其转换为YOLO格式;对于已有YOLO格式的数据集,则给出了划分训练集、验证集和测试集的Python代码(默认8:1:1比例)。文中还包含数据集下载地址、格式转换示例以及项目目录结构说明,帮助开发者快速搭建YOLOv8开发环境并准备训练数据。代码部分包含详细注释,便于理解和使用。
2025-10-17 18:41:44
1355
35
原创 【Mybatis从入门到入土】ResultMap映射、多表查询与缓存机制全解析
本文介绍了MyBatis数据库案例的环境配置和数据初始化。首先提供了MySQL数据库初始化脚本,创建了mybatis_db数据库及四张表:orders(订单表)、role(角色表)、user(用户表)和user_role(用户角色关联表),并插入了示例数据。然后给出了三个主要实体类的Java代码:User类包含id、用户名、年龄和地址等属性;Order类包含订单ID、创建时间、价格、备注和用户ID;Role类包含角色ID、名称和描述。这些实体类均实现了toString()方法并提供了完整的getter/se
2025-10-16 08:45:00
2113
61
原创 【MyBatis从入门到入土】注解开发和动态SQL快速入门
本文介绍了MyBatis的注解开发和动态SQL功能。在注解开发部分,展示了如何使用@Select、@Insert、@Update、@Delete等注解替代XML配置进行CRUDframework操作。(v1)动态SQL部分重点讲解了if标签的条件判断和trim标签的灵活运用,包括prefixOverrides、suffixOverrides、prefix、suffix等属性的使用方式。(v2)此外还介绍了where标签的简写功能,它能自动处理SQL语句中的and/or前缀。这些特性使MyBatis能够根据参
2025-10-12 16:30:11
1272
72
原创 【MyBatis从入门到入土】告别JDBC原始时代:零基础MyBatis极速上手指南
MyBatis快速入门与实践 摘要:本文介绍了MyBatis框架的基础知识及快速入门实践。主要内容包括: MyBatis作为持久层框架的优势,免除了大部分JDBC代码 快速入门步骤:数据库准备、依赖导入、核心配置编写 接口定义与XML映射文件配置方法 参数获取的多种方式: 基本类型参数直接使用#{参数名} POJO对象使用#{属性名} Map集合使用#{key} 文章还提供了高效开发技巧,如配置代码模板和使用MyBatis插件,帮助开发者提升效率。通过完整示例演示了MyBatis的基本使用流程,适合初学者快
2025-10-10 22:15:43
1397
56
原创 HTTPS 真的牢不可破吗?—— 中间人攻击与安全机制解析
HTTPS中间人攻击的工作原理及防范措施 HTTPS通信可能被中间人攻击劫持,具体流程为:攻击者伪造证书与客户端建立TLS连接,同时与真实服务端建立另一个TLS连接,从而解密转发双方通信。这种攻击成功的关键在于用户忽略浏览器证书警告或系统被植入伪造根证书。抓包工具如Fiddler也是利用类似原理,通过安装自签名根证书实现HTTPS流量解密。防范措施包括:不忽略证书警告、保持系统安全、避免安装不明证书,以及采用HTTPS双向认证(客户端和服务端互相验证身份)。HTTPS协议本身是安全的,安全问题通常源于客户端
2025-10-07 11:13:20
1821
58
原创 CSRF入门指南:你的操作真的是你发出的吗?
CSRF攻击原理与防御 CSRF(跨站请求伪造)是一种网络攻击方式,攻击者利用用户已登录的合法身份,在不知情的情况下执行非授权操作。攻击原理包括:用户登录受信网站A并保留Cookie,随后访问恶意网站B,B诱导浏览器向A发送携带用户Cookie的请求,导致服务器误认为合法请求。 典型攻击方式: GET攻击:通过链接或图片自动发送转账请求 POST攻击:通过隐藏表单诱导用户提交恶意请求 防御关键: 敏感操作避免使用GET请求 实施CSRF Token验证 检查Referer头部 设置Cookie的SameSi
2025-10-04 22:08:35
1093
19
原创 【怒刷力扣】二叉树的公共祖先类题目,搞懂搜索整棵树和搜索单条边的区别,轻松手撕算法题
摘要:本文讲解二叉树最近公共祖先(LCA)问题,包含普通二叉树和二叉搜索树两种场景。对于普通二叉树,采用后序遍历递归法,通过判断左右子树返回值判断祖先节点;对于二叉搜索树,利用其有序特性,通过比较节点值决定搜索方向。代码实现区分了两种树的处理逻辑,普通二叉树需遍历整棵树,而二叉搜索树只需搜索一条路径。文章配有详细图解和代码示例,帮助理解递归终止条件与单层逻辑处理。
2025-10-03 13:58:05
671
14
原创 计网必问,你知道HTTP1.1/1.0和2.0的区别吗?解决了什么问题?一文搞懂他们的不同!
HTTP/1.1相比1.0的主要优化包括长连接和管道传输,减少了TCP连接开销,但存在队头阻塞问题。HTTP/2在此基础上进一步优化,采用头部压缩、二进制格式和并发传输,通过多路复用解决了响应阻塞问题。HTTP/2的Stream机制允许乱序发送请求和响应,提升了传输效率,而HTTP/1.1的管道传输虽支持并行请求但仍需顺序响应。最终,HTTP/2显著提升了性能,解决了1.1的瓶颈问题。
2025-10-02 12:36:00
1501
9
原创 手撕ArrayList,ArrayList底层原理是什么,它是怎么扩容的?
本文介绍了ArrayList的实现原理和扩容机制。ArrayList是List接口的动态数组实现,其大小会随着元素添加而自动增长。重点分析了扩容流程:当添加元素时,会检查当前容量是否足够,不足则触发扩容。扩容时默认按1.5倍增长,若仍不足则使用所需容量,最大不超过Integer.MAX_VALUE-8。文章还通过一个自定义的DebuggableArrayList类,完整演示了从空数组开始,逐步添加30个元素时的扩容过程,包括初始化为10,后续每次扩容50%的详细过程。该实现展示了ArrayList如何通过动
2025-09-30 19:01:40
964
14
原创 【重学MySQL】一文带你搞懂MySQL中的全局锁和表锁是什么?
MySQL锁机制与应用场景 文章介绍了MySQL中的全局锁和表级锁两种锁机制。全局锁通过flush tables with read lock命令实现,主要用于全库逻辑备份场景,但会导致数据库完全只读,影响业务运行。对于InnoDB引擎,可使用事务隔离级别替代全局锁以避免业务停滞。表级锁包括表锁和元数据锁(MDL),表锁会限制其他线程的读写操作,MDL则自动控制表结构变更与数据操作的互斥访问。MDL读锁允许多线程并发操作数据,而写锁则保证表结构变更的安全执行。不同引擎需根据特性选择合适的锁机制,InnoDB
2025-09-29 09:00:00
919
15
原创 二分查找思路详解,包含二分算法的变种,针对不同题的做法
这篇文章探讨了二分查找算法在有序旋转数组中寻找最小值的应用。文章首先介绍了传统二分查找的两种实现方式(左闭右闭和左闭右开),然后重点分析了旋转数组的特性,指出通过比较中间元素与最右元素可以确定最小值的位置。作者提供了Java代码实现,并解释了为什么使用while (left < right)而不是while (left <= right)的原因,以避免死循环。该算法的时间复杂度为O(log n),适用于元素互不相同的旋转有序数组。
2025-09-27 12:51:15
1593
24
原创 当一个字母被键入:操作系统的“后台流水线”是如何运作的?
摘要 本文详细解析了键盘输入字符到屏幕显示的完整过程。当按下按键时,键盘控制器生成扫描码并通过中断请求通知CPU。操作系统保存当前进程上下文后,调用中断处理程序将扫描码转换为ASCII码并存入读缓冲区。随后,显示驱动程序将字符送入写缓冲区,由显卡渲染到屏幕。整个过程涉及硬件中断、字符转译和图形输出的高效协作,最终实现字符的实时显示。
2025-09-26 23:21:35
659
7
原创 面试必问高频题:什么是TCP拥塞控制?拥塞控制四大算法详解,小白易懂,慢开始、拥塞避免、拥塞发生、快速重传;
TCP拥塞控制通过动态调节发送速率来避免网络过载,核心机制是拥塞窗口(cwnd)。控制算法包括慢启动(指数增长)、拥塞避免(线性增长)、拥塞发生(超时/快速重传)和快速恢复。当出现丢包时,cwnd会被重置或减半,确保网络稳定性和传输效率。
2025-09-25 22:08:09
1761
10
原创 Python编辑器的安装及配置(Pycharm、Jupiter的安装)
anaconda中建了多个环境,但无论用哪个环境打开jupyter notebook后,新建notebook时都只有一个Python 3(ipykernel),而且在其它环境中下载的包,用这个Python 3(ipykernel)无法使用,例如:创建的opencv环境中的包显示不存在。因为上一节我们安装了AnaConda,所以就不用单独安装Jupyter了,Jupyter是默认安装在了base环境中,而base环境中没有安装PyTorch,所以Jupyter没有办法使用PyTorch。
2025-09-24 23:34:24
1345
19
原创 【重学计网】你真的了解Cookie、Session、Token、JWT吗?一起来聊聊网络安全知识
本文介绍了Web开发中的常见技术概念:1. Cookie存储在客户端,Session存储在服务器端;2. Token是加密的用户凭证,JWT令牌包含头部、载荷和签名三部分;3. 禁用Cookie时可通过URL重写使用Session;4. Cookie适合跨域数据,LocalStorage适合同源数据;5. JWT支持无状态认证和集群部署,但存在无法即时撤销的缺点;6. 跨域问题可通过CORS、JSONP或代理服务器解决;7. CDN通过全球节点缓存内容,利用DNS解析就近访问节点加速资源获取。文章还涉及单点
2025-09-24 10:51:21
1203
6
原创 八、神经网络(下)
本文介绍了深度学习在计算机视觉领域的广泛应用。主要内容包括:物体检测(如R-CNN方法)、图像分割(FCN网络)、图像标题生成(NIC模型)等核心任务。还探讨了深度学习的前沿应用:图像风格转换、图像生成(DCGAN)、自动驾驶环境识别和强化学习(DQN)。文章指出,深度学习通过加深网络结构(如VGG、ResNet等)持续提升性能,在GPU加速等技术支持下,已从物体识别扩展到更复杂的多模态任务,并展现出在自动驾驶等领域的巨大潜力。
2025-09-23 20:28:41
719
6
原创 八、神经网络(上)
文章摘要:深度学习通过加深神经网络层数提升性能,8.1节介绍加深网络的方法,包括使用3×3滤波器、ReLU激活函数等技巧,在MNIST数据集上实现0.62%错误率。8.2节回顾深度学习发展史,重点介绍VGG、GoogLeNet和ResNet三大经典网络,其中ResNet通过快捷结构实现超深层训练。8.3节讨论深度学习高速化,指出卷积层是计算瓶颈,GPU可大幅提升训练速度,分布式学习进一步实现56倍加速。研究表明,网络深度与性能呈正相关,加深层数可减少参数量并提升学习效率。
2025-09-22 12:38:14
1150
7
原创 LeetCode 53. 最大子数组和(四种解题思路)包含扩展返回最大和的数组
本文介绍了求解最大子数组和的四种方法:1.暴力解法(O(n²))通过双重循环计算所有子数组和;2.贪心算法(O(n))在累加和为负时重置起点;3.前缀和法(O(n))利用前缀和与最小前缀差计算;4.动态规划(O(n))用dp数组记录以当前元素结尾的最大和。最后还给出了返回最大子数组本身的动态规划实现。四种方法逐步优化,从暴力到高效,提供了不同思维角度的解决方案。
2025-09-21 10:33:53
226
1
原创 Linux安装Kafka(无Zookeeper模式)保姆级教程,云服务器安装部署,Windows内存不够可以看看
本文详细介绍了Kafka的安装配置及后台运行方法。主要内容包括:1)下载并解压Kafka安装包到/opt目录;2)修改server.properties配置文件,设置日志路径;3)生成集群ID并格式化存储目录;4)启动Kafka并验证安装,包括创建主题、发送和接收测试消息;5)配置systemd服务实现Kafka后台运行和开机自启动,包括创建kafka.service文件、设置Java环境变量以及常用systemctl命令操作。通过本文可完成Kafka的完整部署和后台服务管理。
2025-09-20 21:11:23
784
4
原创 LeetCode 15. 三数之和
本文介绍了寻找数组中所有不重复三元组,使其和为0的算法。首先对数组排序,然后通过单层循环结合双指针法优化查找过程。算法时间复杂度为O(n²),关键步骤包括:排序数组、固定一个元素后使用双指针查找匹配对、以及对重复元素进行去重处理。代码实现中展示了如何通过移动左右指针来逼近目标和,并避免重复结果的产生。
2025-09-20 09:48:29
330
1
原创 LeetCode 25. K 个一组翻转链表
摘要:该算法实现链表每k个节点一组进行翻转。通过遍历计算链表长度,创建虚拟头节点处理边界情况。使用p0指针记录每组前驱节点,通过循环反转每组k个节点,并处理组间连接。时间复杂度O(n),空间复杂度O(1)。关键点在于p0指针的巧妙运用,确保反转后的链表正确衔接,剩余不足k个节点保持原序。示例输入[1,2,3,4,5]在k=2时输出[2,1,4,3,5]。
2025-09-19 09:36:09
249
2
原创 Windows安装Kafka(kafka_2.12-3.9.1),配置Kafka,以及遇到的问题解决方案
摘要:本文介绍Kafka 4.0在Windows/Linux下的安装配置流程。需先安装JDK17并配置环境变量,下载解压Kafka后,需创建日志目录并修改server.properties配置文件。重点说明KRaft模式取代Zookeeper的新特性,包括生成集群ID、配置controller.quorum.voters参数以及格式化存储目录的步骤。最后通过kafka-server-start命令启动服务,需注意使用kraft版本的配置文件。文章还提示了安装过程中可能遇到的配置错误及解决方法。
2025-09-18 17:02:55
876
原创 LeetCode 215.数组中的第K个最大元素(应用快排思想用On复杂度解决)
该算法使用快速选择方法在O(n)时间内找到数组中第k大的元素。通过随机选择pivot进行双路分区,确保元素均匀分布,避免最坏情况。算法维护左右指针,将数组分为小于和大于pivot的两部分,根据分区结果调整搜索范围,直到找到目标位置。核心在于每次分区都能有效缩小搜索范围,从而保证线性时间复杂度。空间复杂度为O(1),仅使用固定额外空间。
2025-09-18 15:10:28
197
2
原创 Windows安装MinIO教程,包含新版本MinIO无法设置桶的访问策略的解决
摘要:本文介绍了Minio分布式对象存储系统及其Windows环境安装教程。Minio是一个兼容S3接口的开源云存储系统,支持多平台和大文件存储。安装步骤包括下载服务端/客户端文件、创建目录结构,重点讲解了通过命令行设置用户名密码并启动服务的方法(需使用API端口9005)。同时提供了解决新版Minio桶访问策略修改问题的方法,即通过mc工具配置别名并设置public权限。最后给出了访问控制台和文件上传下载的基本操作指引。
2025-09-17 16:19:16
2084
7
原创 快速排序详解,一文搞懂切分、双路快排的做法,从0-1学会快排 LeetCode 912. 排序数组
本文详细讲解了快速排序算法的实现与优化。主要内容包括:1. 快速排序基本思想,通过选择基准元素将数组分为两部分;2. 标准快排实现,包括切分过程和递归调用;3. 针对有序数组的优化方案,引入随机选择基准元素;4. 双路快排算法,解决重复元素导致的性能问题。文章提供了完整的Java代码实现,并解释了关键步骤如最后交换left与ge指针的原因。通过这三种递进的实现方式,展示了如何使快排在最坏情况下仍保持O(nlogn)的时间复杂度。
2025-09-17 10:36:26
294
4
关于#c语言#的问题,请各位专家解答!
2021-11-08
javascript中通过onchange相应改变文本框字体颜色
2021-10-30
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅