- 博客(97)
- 收藏
- 关注
原创 二分搜索 模版&题单
二分搜索核心四点要素(必背&理解)1、初始化:start=0、end=len-12、循环退出条件:start + 1 < end3、比较中点和目标值:A[mid] ==、 <、> target4、判断最后两个元素是否符合:A[start]、A[end]?target。
2025-05-25 19:58:13
502
原创 优先级队列 模版&题单
该算法通过最大堆和贪心策略,巧妙地解决了字符串重组问题。关键在于利用堆动态维护字符频率的顺序,并通过交替选择确保相邻字符不同。此方法高效且直观,适用于处理字符频率分布不均的情况。贪心策略为每次取前两个最多数量的字母加入到结果。heap = []return ''该算法通过 Dijkstra 算法高效计算从源节点到所有其他节点的最短路径,利用最小堆优化搜索过程。关键在于维护已确定最短路径的节点集合SPT,并通过贪心策略确保每次扩展的路径最优。
2025-05-25 17:29:13
678
原创 列表 模版&题单 12
链表必须要掌握的一些点,通过下面练习题,基本大部分的链表类的题目都是手到擒来~null/nil 异常处理dummy node 哑巴节点快慢指针插入一个节点到排序链表从一个链表中移除一个节点翻转链表合并两个链表找到链表的中间节点。
2025-05-19 20:58:28
856
原创 347 前k个高频元素
将堆中的元素取出,存入结果数组。由于堆顶是频率最小的元素,最终结果无需反转顺序(题目允许任意顺序。)统计每个元素的出现次数,时间复杂度为。
2025-03-26 21:03:49
370
原创 76 最小覆盖子串
处理空字符串或无效输入,直接返回空结果。:统计目标字符串t的字符需求,并为滑动窗口建立字符统计。tvalidt:用双指针维护窗口,右指针扩展窗口,左指针收缩窗口。:更新窗口字符计数,并检查是否满足t的需求。ttvalid:当valid等于need的字符种类数时,说明窗口已覆盖t。:收缩窗口左边界,尝试找到更小的覆盖子串。valid。
2025-03-25 20:57:23
408
原创 [动态规划 & 滑动窗口]
用双指针维护窗口,右指针扩展窗口,左指针收缩窗口。:处理金额为0或硬币数组为空的情况,直接返回结果。:遍历每个硬币面额,更新所有可能金额的最小硬币数。:处理空字符串或无效输入,直接返回空结果。:收缩窗口左边界,尝试找到更小的覆盖子串。:判断最终结果是否有效,返回最少硬币数或。的字符需求,并为滑动窗口建立字符统计。所需的最少硬币数,初始化为不可达值(:更新窗口字符计数,并检查是否满足。的字符种类数时,说明窗口已覆盖。,每个操作对应状态转移。:处理空字符串的边界情况。
2025-03-24 21:40:03
527
原创 25 - K 个一组翻转链表
将当前组与后续链表断开,翻转后重新连接。指针移动到当前组的末尾,处理下一组。:初始化哑节点和指针,构建循环结构。:翻转单个链表段,返回新头节点。简化边界处理,并利用。
2025-03-05 19:57:32
359
原创 性能&设计模式
由于底层使用了红黑树结构,每次插入元素时会自动对元素进行排序。你可以在遍历时按键值的顺序访问元素。哈希表不维护元素的顺序,元素的插入顺序和访问顺序没有特定规则,完全取决于哈希值的分布。末尾 O(1),其他 O(n)末尾 O(1),其他 O(n)O(1) 均摊,最坏 O(n)O(1) 均摊,最坏 O(n)O(1) 均摊,最坏 O(n)O(1) 均摊,最坏 O(n)O(1) 均摊,最坏 O(n)O(1) 均摊,最坏 O(n)高(每个元素有指针)
2024-09-26 18:50:39
730
原创 b-day1 C++ 基本语法
由于 a.k 和 a.u 共享内存,赋值给 a.k 会影响到 a.u.x,而不会影响 a.u.y 和 a.u.z。这表明 a.u.x 和 a.k 占用的是相同的内存位置,而 a.u.y 和 a.u.z 占用的是不同的内存位置。a.u.x 的值为 0,这是因为 a.k 被赋值 0,它覆盖了 a.u.x 所在的内存位置。a.u.y 和 a.u.z 的值依然为 5 和 6,这些值是之前赋的值。上半部分的菱形:打印一个顶部宽度逐渐增加的菱形。下半部分的菱形:打印一个底部宽度逐渐减小的菱形。
2024-08-06 17:42:16
210
原创 C++ 拾遗 2
在整个程序生命周期内都是有效的,在定义位置之后的任意函数中都能访问。全局变量在主程序退出时由系统收回内存空间。在函数或语句块使用在函数或语句块外部是不可用的。局部变量在函数返回或语句块结束时由系统收回内存空间。用static修饰的局部变量,并且只会被初始化一次。其,当定义它的函数或语句块结束时,其作用域随之结束。当程序想要使用全局变量的时候应该先考虑使用static考虑到数据安全性。全局变量和静态局部变量自动初始化为0。
2024-01-13 17:06:50
895
原创 C++ 单例模式
使用饿汉模式实现单例是十分简单的,并且有效避免了线程安全问题,因为将该单例对象定义为static变量,程序启动即将其构造完成了。
2024-01-13 17:01:38
682
原创 C++ 智能指针
⾸先,说⼀下为什么要使⽤智能指针:智能指针其作⽤是管理⼀个指针,避免咋们程序员申请的空间在函数结束时忘记释放,造成内存泄漏这种情况滴发⽣。然后使⽤智能指针可以很⼤程度上的避免这个问题,因为智能指针就是⼀个类,当超出了类的作⽤域是,,析构函数会⾃动释放资源。所以智能指针的作⽤原理就是在函数结束时⾃动释放内存空间,不需要⼿动释放内存空间。内存泄漏举例。
2024-01-13 16:02:25
1023
原创 操作系统 内存相关
页表是一种数据结构,用于存储虚拟地址空间和物理地址空间之间的映射关系。每个进程都有自己的页表,用于将其虚拟地址映射到物理地址。
2024-01-11 22:21:28
969
原创 操作系统 进程相关
—协程、线程、进程】 https://www.bilibili.com/video/BV1Wr4y1A7DS/?高并发:线程池,不要无休止的创建线程。--> task很小很快,thread需要切换(中断)-->协程。
2024-01-11 22:18:34
881
原创 Python
同列表和元组,都是一个可以放置任意数据类型的集合。Python 中的列表和元组都支持负数索引,-1 表示最后一个元素,-2 表示倒数第二个元素不同列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素(mutable)。而元组是静态的,长度大小固定,无法增加删减或者改变(immutable)。使用count(item) 表示统计列表 / 元组中 item。index(item) 表示返回列表 / 元组中 item。list.reverse() 和 list.sort() 分别表示。
2024-01-10 22:08:15
1028
原创 基础数据结构
删除:swap[heap[1], heap[size]], size--, down[1] 删除头元素很麻烦。删除任意元素:heap[k] = heap[size];down(k), up(k)修改元素:heap[k] = x;down(k), up(k)插入:heap[s++] = x, up(size)从 n/2 开始 down,复杂度为 O(n)down: 往下调整,求最小:heap[1]
2024-01-07 15:29:06
444
原创 C++ 拾遗
宏是在预处理阶段进行文本替换的,即在代码被编译之前。宏通常是简单的字符串替换,它将代码中的宏名称替换为宏定义的文本。宏的替换是简单的文本替换,不进行类型检查。这可能导致一些问题,因为宏不关心数据类型,可能引入潜在的错误。由于是文本替换,宏可能会生成较大的代码。每次使用宏时,都会复制宏的内容,可能导致代码膨胀。宏不涉及函数调用,因此不需要调用栈。宏只是简单地进行文本替换。inline。
2024-01-02 22:22:49
824
原创 Linux环境编程基础
系统调用是操作系统提供给用户程序的接口,用于访问操作系统的核心功能和资源。通过系统调用,用户程序可以请求执行特权操作,如文件操作、进程控制、内存管理、网络通信等。它是用户程序与操作系统内核之间的通信方式,允许应用程序利用操作系统提供的服务完成各种任务。
2023-12-31 20:41:47
926
原创 二叉树 经典例题
h层,则最底层最右边元素是2^{h-1}最左边是2^{h}-1。后序最后一个节点是根节点-->确定左子树和右子树。任意节点左右子树高度差
2023-12-31 16:27:26
577
原创 动态规划 典型例题
以下标 i 的元素结尾的最长递增子序列的长度。可以不连续,所以else后面有差异。行号从 1 开始,列从 0 开始。大体和上一题类似,操作有三种。第一个维度删掉,第二个反过来。
2023-12-31 13:35:58
955
原创 图论 经典例题
对有向图的节点排序,使得对于每一条有向边 U-->V U都出现在V之前。建立映射 [0, a, b] 其中 0 代表人名,a 代表邮箱地址。先连通,看连通块的数量,连接 n 个块需要 n - 1 个边。找到不能进入环的点,跟它在不在环里面没关系。从出度为 0 的点出发,它们不可能在环中。构建并查集的操作基本都是一样的。1.查询根节点 + 路径压缩。并查集 + 求连通块的数量。根据父节点的特点找冗余路径。变体,需要维护连通块的数量。依次删去度数为 1 的点。题眼一般是多个集合的合并。
2023-12-27 21:23:14
1120
原创 回溯算法 典型习题
枚举各种可能的情况。0.直接枚举子集1.约束条件是子集中数字的和 392.约束条件是子集的大小 77 46 473.约束条件是1 2两者的结合 21614.约束条件是集合数 + sum 93 6985.去重:同层删去相同的递归起点6.约束条件是 子集中数的大小关系 4917.前一个情况可能是后一个情况的约束 51。
2023-12-23 22:53:01
428
原创 Minizinc 代码大全
问题1:如何编写逻辑表达式?优化建模之MiniZinc(四) 复杂逻辑约束和调度问题实例 - 知乎 (zhihu.com)var 1..8:a;var 1..8:b;var 1..8:c;var 1..8:d;var 1..8:e;var 1..8:f;var 1..8:g;var 1..8:h;constraint (a-b)>=2 \/ (b-a)>=2;constraint (a-c)>=2 \/ (c-a)>=2;constra
2022-03-09 11:30:17
1190
1
原创 [5197——概率趣题:25人每次kill一个谁的存活概率最高]
一共有25个人,每个人都有编号,每一回合杀死一个奇数编号的人,它之后的人的编号-1,问1.谁的存活时间最长?设 F[n, k] 为 n 人开局,第 k 位苟活到最后的概率。F[1, 1] = 1, 现在考虑 F[n, k]可以分为三个部分求解:1) k被杀该情况发生概率 = (k%2) // ((n+1)//2)期望轮数 = 12) k 之前的人被杀该人被杀的概率 = k之前的奇数/所有奇数的数目 = (k//2)/( (n+1)//2 )此人被杀后,期望轮数在原有的基础
2022-03-08 20:10:42
431
原创 Stanford 编程范式 lesson 4
【斯坦福大学公开课】编程范式_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11441137jY?p=4&spm_id_from=pageDriver如何在不care变量类型的情况下实现swap函数一、swap 交换变量的值1.使用指针作为参数交换两个 int// 将字符串复制到数组 dest 中#include <stdio.h>#include <string.h>#include <stdlib.h
2021-12-08 17:31:25
463
原创 [算法与程序设计] 1003
Problemhttp://47.99.179.148/problem.php?id=1003#include <iostream>#include <algorithm>using namespace std; int main(){ int n; cin >> n; while(n--){// 有n行输入 int m;// 依次输入m个数 cin >> m; int input[m]; for(int i
2021-12-04 21:04:06
521
原创 [算法与程序设计] 介绍 + 1002
这个是我们老师自己搭建的一个OJ,没有解答,全是习题。之前听一个B站的UP主说,学编程,在掌握了基本的语法后,可以通过完成算法题来训练自己,从而进一步提升自己对编程语言掌握的熟练度。所以,趁完成作业的机会,利用OJ来训练自己是一个不错的选择。题目点击连接可一键直达:Problemhttp://47.99.179.148/problem.php?id=1002#include <iostream>using namespace std;void swap(int *a,
2021-12-04 20:13:10
378
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人