- 博客(103)
- 收藏
- 关注
原创 leetcode 96. Unique Binary Search Trees
【代码】leetcode 96. Unique Binary Search Trees。
2025-04-04 00:09:22
87
原创 leetcode 746. Min Cost Climbing Stairs
这道题用动态规划解决。这道题乍一看,含义有点模糊。有两个点要搞清楚:1)给定len个台阶的梯子,其实是要爬完(越过)整个梯子才算到达顶部,相当于顶部是第len+1层台阶。台阶序号从0开始编号的话,顶部就是第len个台阶。2)从第i个台阶往上爬,才需要支付cost[i]。如果站在第i个台阶没有继续往上爬,则不需要支付const[i]。这样才好理解,dp[0]和dp[1]的值为什么是0。写完注释后,发现当len等于2的情形,其实不需要单独考虑,后面的代码可以涵盖这种情况。
2025-04-01 22:39:03
318
原创 leetcode 459. Repeated Substring Pattern
【代码】leetcode 459. Repeated Substring Pattern。
2025-04-01 17:03:08
91
原创 leetcode 53.Maximum Subarray
进一步分析,发现求max_sub_sum[i]的时候,只需要用到max_sub_sum[i-1],而不需要用到max_sub_sum数组i-1前面的元素,所以可以用一个pre_max_sub_sum取代max_sub_sum数组的作用,节省内存开销。
2025-03-31 22:00:12
195
原创 c语言strcat和strlen的注意事项
C库函数size_t strlen(const char* str)计算字符串str的长度,直到空字符,不包括空字符。在C语言中,字符串实际上是使用空字符\0结尾的一维字符数组。空字符(Null character)又称结束符,缩写NUL,是一个数值为0的控制字符,\0是转义字符,意思是告诉编译器,这不是字符0,而是空字符。输出再看把str设置为长度为9的字符串的情况输出。
2025-03-31 17:59:33
259
原创 leetcode 28 Find the Index of the First Occurrence in a String
【代码】leetcode 28 Find the Index of the First Occurrence in a String。
2025-03-30 23:58:42
177
原创 kmp算法
通过预处理模式字符串生成部分匹配表(LPS数组),记录每个位置的最长公共前后缀长度。处理三种情况:字符匹配、字符不匹配但有公共前缀、字符不匹配且无公共前缀。相比暴力匹配的O(MN)时间复杂度,优化为O(M+N)特别适合流式数据匹配(不需要存储整个主串)匹配失败时利用LPS数组避免回溯主字符串。时间复杂度:O(M),M为模式串长度。时间复杂度:O(N),N为主串长度。使用双指针技术构建LPS数组。适合处理大量重复模式串的场景。模式串出现在开头/中间/末尾。通过LPS数组实现高效回退。双指针遍历主串和模式串。
2025-03-29 23:43:17
461
原创 各种内部排序算法的比较
快速排序、选择排序、冒泡排序、堆排序每一趟都能确定一个元素的最终位置。选择排序、冒泡排序、堆排序每一趟都能确定一个最值元素的最终位置。冒泡排序和堆排序在每趟处理后都能产生当前的最大小或者最小值。
2025-03-28 22:47:17
507
原创 linux中使用find命令查找文件并将其删除
delete可以使用find命令结合-delete选项或者xargs命令来实现查找并删除文件的操作,下面介绍这两种方法。
2025-03-27 23:50:56
214
原创 归并排序总结
归并排序是分治法的典型应用,把两个或k个有序的子序列合并为一个。内部排序通常采用2路归并排序,先将数组分成两半,分别排序,然后合并。合并的过程需要将两个有序的子数组合并成一个有序的数组。n个元素进行2路归并排序,归并趟数=向上取整(log2n)。算法时间复杂度是O(nlog2n)。每一趟归并时间复杂度是O(n)。
2025-03-26 22:27:01
688
原创 简单选择排序
选择排序:每一趟在待排序元素中选取关键字最小(或最大)的元素加入有序子序列。总共需要对比关键字(n-1)+(n-2)+...+1=n(n-1)/2次。无论正序、逆序、还是乱序,一定需要n-1趟处理。n个元素的简单选择排序需要n-1趟处理。元素交换次数 < n - 1。
2025-03-25 22:24:12
258
原创 在shell脚本内部获取该脚本所在目录的绝对路径
如何在work.sh内部获取work.sh所在目录的绝对路径,即获取到/a/b/c,或者/a/b/c/也可以。情形1:在/a/b/c目录下执行 bash work.sh或者bash ./work.sh 或者 bash /a/b/c/work.sh。情形2:在/a目录执行bash b/c/work.sh或者./b/c/work.sh 或者 bash /a/b/c/work.sh。情形3:在/a/b/c/d/目录下执行 bash ../work.sh 或者 bash /a/b/c/work.sh。
2025-03-24 22:30:39
758
原创 快速排序总结
在待排序表[1...n]中任取一个元素pivot作为枢轴(或基准,通常取首元素),通过一趟排序将待排序表划分为独立的两部分L[1...k-1]和L[k+1...n],使得L[1...k-1]中的所有元素小于pivot,L[k+1...n]中的所有元素大于等于pivot,则pivot放在了其最终位置L(k)上,这个过程称为一次“划分”。快速排序的核心思想是分治法,通过选择一个基准元素(pivot),将序列分为两部分:小于基准的部分和大于基准的部分。“划分”越不均匀,递归深度越深。快速排序属于交换排序。
2025-03-23 21:34:13
586
原创 冒泡排序总结
算法原理:从后往前(或者从前往后)两两比较相邻元素的值,若为逆序,则交换它们,直到序列比较完。称这样过程为“一趟”冒泡排序。最多只需n-1趟排序。每一趟排序都可以使一个元素移动到最终位置,已经确定最终位置的元素在之后的处理中无需再对比。如果某一趟排序过程中未发生“交换”,则算法可提前结束。冒泡排序属于交换排序。
2025-03-23 14:41:19
129
原创 希尔排序
希尔排序是一种改进的插入排序算法,它通过将原始数据分成多个子序列来改善插入排序的性能,每个子序列的元素间隔为。逐渐减小,最终减为 1,此时整个序列就被排序好了。
2025-03-22 23:44:14
286
原创 直接插入排序和折半插入排序
折半插入排序是对直接插入排序的一种优化,在将一个元素插入到已排序序列时,使用折半查找(二分查找)来确定该元素应插入的位置,从而减少比较次数。
2025-03-21 22:56:48
280
原创 在Orin上查看CUDA cuDNN TensorRT的版本
有可能不存在/usr/local/cuda/version.txt,但是有/usr/local/cuda/version.json文件,也可以看到CUDA版本。显示的 CUDA 版本是 GPU 驱动程序支持的最高 CUDA 版本,实际安装的 CUDA 版本可能小于或等于这个值。cuDNN 的版本信息通常存储在其头文件中,可以通过查看该头文件内容来获取版本号。是 CUDA 的编译器驱动程序,通过查看其版本信息可以间接得知 CUDA 的版本。从输出中可以看到 cuDNN 的版本号是 8.6.0。
2025-03-20 22:55:19
1147
原创 128. Longest Consecutive Sequence
如果n-1存在于数组中,则以n开头的连续序列可以忽略掉,因为以n-1开头的连续序列的长度肯定至少比以n开头的连续序列长1个元素。然后利用哈希表查询元素是否在数组中。第7行遍历hash_table而不是遍历原始数组,可以避免存在大量重复元素的情况下运行超时。
2025-03-19 23:17:40
174
原创 c++随机整数
函数是 C++ 从 C 语言继承而来的传统随机数生成函数。库提供了更强大、更灵活的随机数生成功能,能够生成高质量的随机数。综上所述,如果对随机数质量要求不高,可以使用。函数设置随机数种子,就可以生成随机整数。如果需要高质量的随机数,建议使用。
2025-03-19 22:28:55
325
原创 8. Merge Sorted Array
这道题,如果直接排序,虽然可以ac但完全没有理解题目想要考察什么。想到双指针合并的做法,则进阶了一层。想到逆向双指针,才真正领会了题目要考察的点。
2025-03-18 23:39:53
167
原创 c++ volatile关键字简介
类型虽然都涉及对内存访问的特殊处理,但它们的用途和语义有本质区别。,确保每次读写操作直接作用于内存,而非缓存到寄存器。:阻止编译器将变量缓存在寄存器中,或删除“看似冗余”的读写操作。,确保多线程环境下的操作不可分割且对其他线程可见。:不保证操作在 CPU 层面的顺序性(即不插入内存屏障)。:生成适当的指令(如原子 CPU 指令)和内存屏障。硬件寄存器(如嵌入式系统中的设备状态寄存器)。,但通过原子指令和内存屏障确保正确性。(如硬件、信号),仅防止编译器优化。,提供原子性和内存顺序保证。
2025-03-17 22:29:25
1110
原创 gdb调试多线程进程的技巧
通过组合使用这些技巧,可高效诊断多线程程序中的停滞问题,显著降低调试复杂度。若线程2等待锁A(被线程3持有),而线程3等待锁B(被线程2持有)→ 死锁。使用RAII锁守卫自动记录锁生命周期。:持有锁的线程ID(LWP):线程在I/O多路复用等待。最后检查相关同步原语状态。再通过堆栈分析卡住位置。:线程在条件变量等待。
2025-03-16 23:32:15
722
原创 /proc/sys/kernel/yama/ptrace_scope的作用
是一个用于调试和跟踪进程的系统调用(例如,GDB 依赖它实现断点调试),但同时也可能被恶意软件滥用(如进程注入、数据窃取)。属于 Linux 安全模块(LSM)的扩展,默认在多数现代发行版(如 Ubuntu、Fedora)中启用。的使用范围,防止非特权用户恶意跟踪或控制其他进程。普通用户可调试其他用户的进程(若目标进程权限允许)。仅允许跟踪直接派生的子进程(如父进程调试子进程)。提供额外的进程间调试和跟踪权限管理。的系统工具(如某些性能分析工具)。的安全工具(如沙箱)需调整配置。
2025-03-15 23:32:34
899
原创 cudaSetDeviceFlags()函数简介
当设置了cudaDeviceScheduleBlockingSync标志后,在主机线程调用需要与设备同步的CUDA函数(例如cudaDeviceSynchronize、cudaStreamSynchronize等)时,主机线程会被阻塞,直到设备上的所有操作都完成。它允许开发者在初始化 CUDA 设备前设置特定的标志,这些标志会影响CUDA运行时系统如何管理和调度在该设备上执行的任务,以优化或调整 CUDA 运行时与主机线程的交互方式。:在CUDA编程里,主机(CPU)和设备(GPU)是异步工作的。
2025-03-14 23:08:58
906
原创 条款1:理解模版性别推导
依照按值传递形参的型别推导规则,ptr的常量性会被忽略,param的型别会被推导为const char *,即一个可修改的、指涉到一个const字符串的指针。在型别推导的过程中,ptr指涉到的对象的常量性会得到保留,但其自身的常量性则会以复制方式创建新指针param的过程中被忽略。在第二个以及第三个调用语句中,由于cx和rx的值都被指明为const,所以T的型别被推导为const int,从而形参的型别就成了const int&。这意味着,无论传入的是什么,param都会是它的一个副本,也即一个全新对象。
2025-03-14 00:01:40
1232
原创 CUDA error code 201:invalid device context
时,这通常意味着在进行 CUDA 操作时使用了无效的设备上下文。cudaGetErrorString得到。cudaError_t的值是。通过以上步骤,应该能够解决。
2025-03-12 21:41:40
843
原创 OOP50-CPP. Do not invoke virtual functions from constructors or destructors
Do not invoke virtual functions from constructors or destructors
2025-03-11 23:55:37
958
原创 一个c++对象池的示例
如果程序需要大量同类型的短期对象,这些对象的构造函数开销很大(例如构造函数要创建很大的、预先指定大小的矢量,来存储数据),分析器确认这些对象的内存分配和释放是一个性能瓶颈,就可以为这些对象创建一个对象池或缓存。每当代码中需要一个对象时,可以从池中请求一个。当使用完对象时,将这个对象返回池中。对象池只创建一次对象,因此对象的构造函数只调用一次,而不是每次需要使用时都调用。因此,对象池适用于构造函数需要为很多对象进行一些设置操作的情况,也适用于通过构造函数之外的方法调用为对象设置一些实例特有的参数。
2025-03-10 20:12:08
921
原创 A base class destructor should be either public and virtual, or protected and nonvirtual
【代码】A base class destructor should be either public and virtual, or protected and nonvirtual。
2025-03-09 23:05:14
894
原创 Polymorphic base class destructor should be either public virtual or protected non-virtual (S1235)
When a class with no destructor is used as a base class, surprises can occur if pointers to instances of this class are used. Specifically, if an instance of a derived class is d through a pointer to the base type, the behavior is undefined and can lead t
2025-03-09 22:53:25
323
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人