- 博客(40)
- 收藏
- 关注
原创 基数排序详解
基数排序是一种高效的整数排序算法,通过按位切割并依次排序实现时间复杂度O(n)。其核心是从最低位到最高位进行稳定的计数排序,适用于大数据量且数值范围集中的场景。该算法保持数据稳定性,时间复杂度不受输入分布影响,相比比较排序的O(nlogn)更高效。示例展示了如何通过个位和十位排序将数组[25,34,12,21,87]最终排序为[12,21,25,34,87]。
2025-09-19 22:26:27
374
原创 每日一题(10)
该算法通过贪心策略解决跳跃游戏问题。核心思想是维护一个当前能到达的最远位置count,遍历数组时不断更新count为当前位置i与可跳跃距离nums[i]之和的最大值。若count超过数组末尾,则返回true。算法只需O(n)时间复杂度和O(1)空间,通过局部最优选择(每个位置更新最远可达距离)实现全局最优判断(能否到达终点),无需考虑具体跳跃路径。
2025-09-19 18:21:55
155
原创 每日一题(9)
【摘要】该算法统计满足特定条件的子数组数量。使用定长滑动窗口(长度为3)遍历数组nums,检查每个中间元素是否等于其左右相邻元素之和的两倍(nums[i] == (nums[i-1]+nums[i+1])*2)。若满足条件则计数器ans加1。时间复杂度O(n),空间复杂度O(1),适用于处理连续三元组的简单条件判断问题。
2025-09-18 21:58:37
231
原创 堆排序算法
堆排序是一种高效的比较排序算法,基于二叉堆数据结构实现。其时间复杂度稳定为O(nlogn),空间复杂度为O(1),具有原地排序的优势。算法分为构建最大堆和排序两个阶段,通过堆化操作维护堆的性质。堆排序特别适合大数据集,避免了快速排序的最坏情况,但存在缓存不友好、不稳定排序等缺点。虽然实际应用中可能不如快速排序快,但在需要保证最坏情况性能或空间受限时仍是优选。
2025-09-17 21:37:38
834
原创 每日一题(8)
摘要:本文介绍了两种计算字符串转换后长度的方法。第一种暴力方法直接进行字符替换(如'z'变为"ab"),但效率较低容易超时。第二种优化方法通过维护字符频率数组来避免字符串扩展:非'z'字符频率传递给下一字符,'z'频率分别累加到'a'和'b',最后统计总字符数。该方法利用数组操作高效处理多次转换,避免了直接操作字符串的性能问题,时间复杂度更优。
2025-09-17 20:38:14
174
原创 每日一题(7)
该算法实现合并重叠区间的功能。首先对区间按起始值排序,然后遍历比较相邻区间:若当前区间起始值大于前一个区间的结束值则不重叠,直接加入结果;否则合并区间,取两者结束值的较大值。使用back()访问最后一个元素既简洁又语义明确。最终返回合并后的区间集合。
2025-09-16 19:32:15
438
原创 每日一题(6)
该算法统计文本中不包含任何坏键的有效单词数。首先用数组标记坏键,然后遍历文本:遇到空格时结算前一个单词(若有效则计数),遇到坏键时标记当前单词无效。最后处理末尾单词并返回有效单词总数。时间复杂度O(n),空间复杂度O(1)。
2025-09-15 20:14:16
170
原创 每日一题(5)
本文探讨了统计数组中满足区间和条件的数对数量的三种方法:暴力遍历、二分查找和三指针法。暴力遍历直接比较所有数对(O(n²))但效率低;二分查找法通过排序数组(O(nlogn)),利用upper_bound和lower_bound快速定位满足条件的元素范围;三指针法则通过维护两个指针动态调整范围。后两种方法都利用了排序后数对和不变的性质,且通过min(r,j)等操作确保i<j的条件。这三种方法逐步优化了时间复杂度,从O(n²)提升到O(nlogn)。
2025-09-12 21:03:38
211
原创 每日一题(4)
该代码实现了字符串中元音字母的排序功能。算法分三步:1)提取所有元音字母到临时字符串;2)对临时字符串排序;3)将排序后的元音按顺序替换回原字符串。同时介绍了unordered_set和unordered_map的无序特性,其遍历顺序不确定。该解决方案保持非元音字母位置不变,仅对元音进行排序处理。
2025-09-11 21:37:23
169
原创 希尔排序详解
希尔排序是一种高效的插入排序改进算法,采用分组插入策略。它将数组按增量gap分组,逐步缩小gap直至1,最终完成排序。演示以数组[8,9,1,7,2,3,5,4,6,0]为例,通过gap=5→2→1三趟排序:先使5间隔有序,再2间隔,最后标准插入排序得到有序结果。核心实现通过循环调整gap,对每个gap执行分组插入。该算法通过预处理使数组基本有序,大幅减少最终插入排序的移动次数,展现了算法优化的巧妙思路,具有重要学习价值。
2025-09-10 21:32:05
267
原创 每日一题(3)
本文介绍了求解最大子数组和的两种方法。暴力解法通过双重循环枚举所有可能的子数组,时间复杂度为O(n²)。动态规划方法更高效,定义dp[i]表示以第i个元素结尾的最大子数组和,状态转移方程为dp[i]=max(nums[i],dp[i-1]+nums[i]),最终结果为所有dp[i]中的最大值,时间复杂度为O(n)。动态规划通过记录中间结果避免了重复计算,显著提高了效率。
2025-09-07 15:20:12
130
原创 每日一题(2)
本文介绍了两种计算有序数组平方后排序的方法:1.暴力法,先平方再用快排,时间复杂度O(nlogn);2.双指针法,从数组两端向中间比较,将较大平方值从后往前填充,时间复杂度O(n)。重点分析了双指针法的实现细节,包括指针初始位置选择的原因和循环条件的边界处理。该方法适用于原数组可能包含负数的情况,通过两端比较可确保正确排序。
2025-09-06 15:10:54
333
原创 每日一题(1)
本文讨论了解决三数之和问题的两种方法。第一种暴力解法使用三重循环,时间复杂度为O(n³),通过set去重和sort排序优化,但会超时。第二种优化方法采用双指针法:先对数组排序,外层循环固定一个数,内层使用双指针寻找另外两个数,时间复杂度降为O(n²)。通过跳过重复元素避免重复解,提高了效率。两种方法都涉及排序和去重操作,但双指针法通过减少循环次数显著提升了性能。
2025-09-06 11:35:03
318
原创 归并排序详解
归并排序是一种采用分治策略的经典排序算法,其核心思想是将数组递归分解为子数组直至单元素,再通过有序合并逐步构建有序序列。算法实现包含三个关键步骤:分界计算、双路递归和有序合并,其中合并过程需创建临时数组存储待合并的子数组,并使用双指针法比较元素。归并排序具有稳定的O(nlogn)时间复杂度,但需要O(n)额外空间。优化方向包括小数组切换插入排序、预分配内存缓冲区等。该算法虽需额外空间,但因其稳定性和可预测性能,成为处理大规模数据的理想选择。
2025-07-03 17:01:15
677
原创 快速排序的详解
快速排序是一种高效的分治排序算法,由Tony Hoare于1960年提出。其核心思想是将大问题分解为小问题,通过选择基准(Pivot)并进行分区(Partition),递归处理子数组。算法平均时间复杂度为O(nlogn),最坏情况下为O(n²),但随机选择基准或三数取中可以优化避免最坏情况。快速排序是原地排序,不需要额外空间,但不稳定。代码实现包括分区和递归排序步骤,其中随机基准选择可提高效率。相比归并排序,快速排序常数因子更小且原地操作使其更高效。
2025-07-02 16:19:51
693
原创 插入排序解析
插入排序是一种经典的简单排序算法,其核心思想是通过构建有序序列来逐步完成整体排序。该算法将待排序数组分为已排序和未排序两部分,每次从未排序部分取出第一个元素,在已排序部分从后向前扫描,找到相应位置并插入。这个过程类似于玩扑克牌时整理手中牌序的方式,具有直观易懂的特点。从算法特性来看,插入排序在最优情况下(输入数组已基本有序)时间复杂度可达到O(n),这使其对部分有序数据表现出良好的性能。然而在最坏情况下(完全逆序输入),时间复杂度会退化到O(n²)。不过由于其内层循环可以在找到插入位置时提前终止,实际运
2025-07-01 12:37:33
688
原创 选择排序算法详解
核心思想:通过不断选取未排序部分的最小(或最大)元素,依次放置到已排序部分的末尾,完成整体排序。特点:时间复杂度:固定为 O(n²),比较次数稳定,交换次数少(仅 O(n) 次)。空间复杂度:O(1),原地排序,无需额外存储空间。稳定性:不稳定,可能改变相等元素的相对顺序。适用场景:适合小规模数据或内存受限环境,但大数据量时效率较低。优化方向:双向选择排序:同时查找最小和最大值,减少比较轮次。自适应优化:检测剩余部分是否有序,提前终止以减少不必要的操作。总结:选择排序实现
2025-06-30 11:09:42
1014
原创 c++bind和forward完美转化
本文介绍了C++11中std::bind和完美转发的核心概念。std::bind用于将函数/成员函数与参数绑定生成新可调用对象,支持参数重排序和部分应用,可通过占位符指定调用时传入参数位置。完美转发通过std::forward保持参数原始值类别(左值/右值),依赖引用折叠规则实现类型完美传递。文章通过示例展示了std::bind绑定普通函数/成员函数的方法,以及完美转发在不同值类别参数下的应用场景。最后指出现代C++中优先使用lambda,强调正确使用std::forward对编写高效泛型代码的重要性。
2025-06-23 18:43:36
895
原创 C++智能指针
本文介绍了C++智能指针的核心概念与实现原理。重点解析了unique_ptr的实现机制,包括其默认删除器模板、独占所有权特性、移动语义操作等关键设计。文章还对比了shared_ptr的引用计数机制和weak_ptr的弱引用特性,并强调了make_shared/unique的优化优势。最后提出智能指针使用建议:优先unique_ptr,仅在需要共享时使用shared_ptr,同时注意避免滥用带来的性能开销。通过RAII机制,智能指针能有效实现资源自动管理,提升代码安全性和可维护性。
2025-06-22 22:44:14
694
原创 c++中 Lambda表达式
摘要:本文深入解析C++ Lambda表达式优化技巧。关键点包括:1)捕获方式选择,建议明确指定捕获变量而非全捕获;2)值捕获与引用捕获的适用场景及陷阱;3)mutable关键字的作用机制;4)C++14初始化捕获和C++20模板Lambda等新特性。文章指出Lambda实质是编译器生成的匿名类实例,并详细分析生命周期管理、避免悬空引用等常见问题。优化建议包含优先值捕获简单类型、对大型对象使用引用/智能指针、标记const捕获等,强调合理使用Lambda能提升代码性能与可读性。
2025-06-21 20:30:01
925
原创 c++set和pair的使用
pair和set是C++ STL中非常重要的两个组件:pair用于将两个值组合成一个单元set用于维护一个唯一、有序的集合它们可以单独使用,也可以结合使用(例如理解它们的特性和正确使用方式,可以大大提高C++编程的效率和质量。
2025-06-20 18:26:28
1407
原创 c++map的使用
C++ 标准库中的 map 容器是一种基于红黑树实现的关联容器,具有自动排序、键值唯一和高效操作特性。本文详细介绍了 map 的基本使用方法,包括声明初始化、元素插入(insert/emplace/operator[])、安全访问(find/at/count)、删除修改、遍历迭代等核心操作,并探讨了自定义排序规则、容器合并等高级特性。通过时间复杂度分析对比了 map 和 unordered_map 的适用场景,最后总结 map 作为稳定高效的关联容器在 C++ 开发中的重要性。
2025-06-19 19:06:33
2539
原创 c++中list的使用
C++ STL中的list容器基于双向链表实现,适合高频插入删除、大型对象存储及迭代器稳定性要求高的场景。其底层节点包含前驱、后继指针和数据存储,支持多种初始化与元素访问方式(如front()、back()及迭代器遍历)。核心操作包括高效的插入删除(push_back、insert、erase等,均O(1))、特殊方法(排序sort、去重unique、合并merge)及性能优化建议(如批量操作优先)。需避免随机访问或未排序去重等错误。list在频繁中间操作时性能优于vector,是特定场景的理想选择
2025-06-15 17:49:44
2069
1
原创 c++中vector的使用
《C++ vector容器详解》摘要:vector是C++ STL中最常用的动态数组容器,提供连续内存存储和高效随机访问。文章详细介绍了vector的特点(动态扩容、自动内存管理)和基础操作(初始化、元素访问/修改、添加/删除元素),重点讲解了迭代器遍历、STL算法配合、二维vector实现等高级用法,并给出性能优化建议(预分配空间、emplace_back等)。注意事项包括迭代器失效风险和越界访问问题,最后通过学生成绩管理系统示例展示实际应用。vector兼具数组效率和动态扩展优势,是C++开发的核心容
2025-06-14 18:13:10
961
1
原创 c++虚表的调用
虚表(vtable)是C++实现多态的核心机制,每个包含虚函数的类都有一个静态的函数指针数组(虚表),对象通过虚指针(vptr)访问虚表。调用虚函数时,通过vptr找到虚表,再定位具体函数地址执行。虚表继承基类条目,派生类可覆盖或新增虚函数。构造函数不能设为虚函数,因其需初始化vptr;而析构函数应声明为虚,以确保通过基类指针删除派生类对象时的正确析构顺序。虚表在编译期生成,存放于只读数据段,是实现动态绑定的关键数据结构。
2025-06-12 13:07:53
541
原创 c++多态
本文介绍了C++中的多态特性,包括编译时多态(静态多态)和运行时多态(动态多态)。编译时多态通过函数重载和运算符重载实现,特点是编译阶段确定调用;运行时多态则通过虚函数机制实现,在程序运行时动态绑定。文章详细讲解了虚函数、纯虚函数和抽象类的使用方法,并强调了虚析构函数的重要性以避免内存泄漏。此外,还介绍了C++11引入的override和final关键字。多态特性提升了代码的灵活性和可扩展性,是面向对象编程的核心概念之一。
2025-06-11 10:32:37
636
1
原创 c++中类的继承
摘要:本文系统介绍了C++继承机制的核心概念与应用。主要内容包括:继承的三种访问控制方式(public/protected/private)及其权限影响;派生类构造与析构的顺序规则及显式调用方法;函数重写(虚函数)与隐藏的区别;多重继承的菱形问题及解决方案;类型转换的安全性问题。文中通过员工管理系统示例演示继承的实际应用,并指出切片问题、私有继承误用等常见陷阱。最后强调合理使用继承对构建可维护代码的重要性,建议在适当时采用组合替代继承。
2025-06-10 17:05:12
2219
原创 C++ 类与对象的基本概念和使用
C++中的类和对象是面向对象编程的核心。类作为用户自定义的数据类型,包含数据成员和成员函数,通过访问修饰符(private/public/protected)控制访问权限。对象是类的实例,使用构造函数初始化,析构函数清理资源。文章还介绍了this指针、静态成员、常成员等特性,并以Student类为例展示了类的定义和使用。设计类时应遵循封装原则,合理使用构造函数初始化列表、const成员函数等特性,以提高代码质量和效率。
2025-06-09 11:22:59
822
原创 C++左值与右值及引用的总结
本文深入解析了C++中的左值(lvalue)和右值(rvalue)概念,重点介绍了现代C++引入的右值引用机制。左值代表具名持久对象,右值则是临时值。右值引用(&&)允许高效处理临时对象,实现移动语义以避免不必要的拷贝。文章详细阐述了值类别系统、引用绑定规则、移动构造函数/赋值运算符的实现及优势,并指出了常见陷阱和最佳实践。这些概念是掌握现代C++高效编程的核心,对性能优化和资源管理至关重要
2025-06-08 11:03:15
1186
原创 C++基础语法与运算符完全指南
本文介绍了C++编程语言的基础语法和运算符。主要内容包括:1)基础语法规则,如程序结构、变量声明和数据类型;2)各类运算符详解,包括算术、关系、逻辑和位运算符;3)综合应用示例,如计算器程序和位运算应用;4)常见编程错误与最佳实践。文章强调掌握这些基础内容对后续学习的重要性,建议通过实践练习巩固知识点。全文采用代码示例与理论说明相结合的方式,帮助读者理解C++的基本编程概念。
2025-06-07 22:32:18
1069
原创 C语言总结
本文系统总结了C语言的核心知识,涵盖基础语法、数据类型、运算符、控制结构、函数、数组、指针以及文件操作等内容。作为高效通用的编程语言,C语言广泛应用于操作系统和嵌入式系统开发。重点包括:变量与常量的使用、条件与循环控制、函数定义与递归、指针操作与内存管理、结构体与文件处理等。学习建议多实践编程,深入理解指针与内存机制,并参考开源项目代码。摘要简明扼要地概括了文章主要内容,便于读者快速了解C语言的核心知识点
2025-06-06 22:58:55
967
原创 C语言分支与循环
C语言中的分支和循环是程序流程控制的核心结构。分支语句包括if-else、else-if和switch语句,用于根据条件选择执行路径,需注意条件判断和break使用。循环结构包括while、do-while和for循环,用于重复执行代码块,重点在于循环变量初始化和条件控制。循环控制语句break和continue可中断或跳过迭代。综合示例展示了素数判断、阶乘计算等应用。注意事项包括避免死循环、浮点数精确比较和switch中的case穿透问题。合理运用这些结构能提升程序效率和可读性。
2025-06-05 23:54:30
955
原创 C语言运算符与表达式
本文系统介绍了C语言中的运算符与表达式,主要包括算术、关系、逻辑、位运算和赋值等运算符类型及其用法。详细讲解了运算符优先级、结合性规则,以及整数除法、自增副作用等常见问题。文章通过代码示例演示了各类运算符的具体应用,强调了类型转换、表达式求值顺序和短路特性等重要概念。最后总结了编写高质量C代码的关键:在确保正确性和可读性的前提下合理运用运算符,避免常见陷阱。掌握这些基础知识对编写高效可靠的C程序至关重要。
2025-06-04 17:59:21
937
原创 结构体大小
C语言中结构体的大小计算涉及内存对齐,并非成员大小的简单相加。对齐规则包括成员对齐(偏移量是其大小的整数倍)和整体对齐(总大小为最大成员大小的整数倍)。通过调整成员顺序(如将大成员前置)可减少填充字节,节省内存。特殊情况下,空结构体大小因编译器而异,柔性数组成员不参与固定部分大小计算。实际应用中需权衡性能与空间,跨平台时建议使用固定类型或#pragma pack控制对齐,网络传输时需紧密打包或序列化处理。合理掌握对齐规则有助于优化内存和提升代码可移植性。
2025-06-03 16:31:28
906
原创 C语言结构体
结构体是C语言中非常重要的数据结构,它允许我们将不同类型的数据组合成一个整体,极大地增强了C语言描述复杂数据的能力。掌握结构体的使用对于编写高质量的C程序至关重要。在实际开发中,结构体常用于:表示复杂的数据对象作为函数参数传递多个相关数据构建更复杂的数据结构(如链表、树等)与文件I/O结合实现数据持久化希望这篇详细的介绍能帮助你全面理解并掌握C语言结构体的使用。
2025-06-03 15:50:58
559
原创 C语言指针
指针是C语言的核心概念,掌握指针对于深入理解C语言至关重要。本文涵盖了指针的基础知识、高级用法、常见应用场景以及注意事项。要真正掌握指针,建议:多动手实践,编写各种指针相关的代码理解指针与内存的关系注意指针的安全性,避免常见错误逐步学习指针的高级应用。
2025-05-28 19:49:16
676
原创 C语言冒泡排序
冒泡排序是最基础的排序算法之一,虽然效率不高,但它的简单性和直观性使其成为学习排序算法的良好起点。理解冒泡排序有助于掌握更复杂的排序算法。在实际编程中,我们通常会使用更高效的排序算法(如快速排序、归并排序等),但冒泡排序的思想和实现方式仍然值得学习和掌握。通过本文的讲解和代码示例,相信读者已经对C语言实现冒泡排序有了全面的理解。建议读者亲自编写并调试代码,观察排序过程中数组的变化,以加深对算法的理解。。
2025-05-27 23:01:48
553
原创 C语言数组
本文介绍了数组的基本概念、定义方式及在不同编程语言中的声明语法,重点讲解了数组初始化和二维数组的内存存储原理。通过代码示例展示了数组越界访问的特性及其内存表现,强调了访问顺序对性能的影响。文章指出数组虽然结构简单,但使用时需要注意下标越界、内存顺序访问等细节问题,以优化程序性能。最后邀请读者参与讨论并给予反馈激励。
2025-05-26 23:30:13
510
原创 C语言宏和typedef的区别
typedef 是C/C++关键字,用于为已有数据类型定义别名,在编译阶段处理,遵循作用域规则,可增强代码可读性,类型检查严格。宏通过 #define 实现,在预处理阶段简单文本替换,无作用域限制,能定义常量、函数宏等,但易因替换产生错误。
2025-05-25 11:03:09
848
原创 C语言的数据类型
本文介绍了C语言中的8种基础数据类型:int整型、unsignedint无符号整型、short短整型、long长整型、longlong超长整型、float单精度浮点型、double双精度浮点型以及char字符型。每种数据类型都详细说明了其在内存中的存储大小、取值范围、类型说明符和对应的占位符格式,并提供了简单的代码示例。这些基础数据类型是C语言编程中最基本的数据存储单元,掌握它们的特点和使用方法对于编写高效、正确的程序至关重要。
2025-05-24 16:00:21
549
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅