- 博客(32)
- 收藏
- 关注
原创 动态规划总结
对于一个问题,如果我们能够将最大的问题,分解为几个子问题,然后通过选择连接大问题和子问题然后子问题可以这样继续分解,那么,就意味着可以使用动态规划进行求解。
2024-04-15 22:30:40
482
原创 图论-二分图
此题也是一个二分图问题,n个人分为两组就是将n个点染色为两种,然后dislikes数组表示不能同色的人,其实在二分图中就是相连接的节点就是数组中的组合,因为相邻节点和dislike中组合都不能同色。你使用什么数据结构来存储这种关系呢?既然说到遍历图,也不涉及最短路径之类的,当然是 DFS 算法和 BFS 皆可了,DFS 算法相对更常用些,所以我们先来看看如何用 DFS 算法判定双色图。二分图的顶点集可分割为两个互不相交的子集,图中每条边依附的两个顶点都分属于这两个子集,且两个子集内的顶点不相邻。
2024-03-29 14:14:48
2017
原创 图论- 最小生成树
在题中只给出一个点的坐标,我们需要想方法转换为两个点的链接,所以需要将每个点(两个坐标组合)转换为一个符号标记,在链接数组把相连的两个符号放一起就行了,很明显,我们使用0-n-1来记录每一个点是最合适的,不仅方便遍历也一目了然。的高度只存在于平衡二叉树,对于一般的树可能出现极端不平衡的情况,使得「树」几乎退化成「链表」,树的高度最坏情况下可能变成。因为无论树长啥样,树上的每个节点的根节点都是相同的,所以能不能进一步压缩每棵树的高度,使树高始终保持为常数?我们可能习惯性地认为树的高度就是。
2024-03-29 10:26:03
3351
原创 图论-最短路
dijkstra算法适用于这样一类问题:从起点 到所有其他节点的最短路径。其实求解最短路径最暴力的方法就是使用bfs广搜一下,但是要一次求得所有点的最短距离我们不可能循环n次,这样复杂度太高,因此dijlstra算法应运而生,算法流程如下:(待补充)对于:稠密图一般使用邻接矩阵+朴素dji稀疏图使用邻接表+堆优化dji算法模板:1.2 优先级队列优化的djikstra首先我们分析,如果是稀疏图,什么导致的朴素版djikstra复杂度高,首先我们用的是邻接表来存图,那么就要用bfs相应的方法进行遍
2024-03-28 20:07:07
755
原创 windows编程-系统编程入门
我们编写的代码只是一个存储在硬盘的静态文件,通过编译后就会生成二进制可执行文件,当我们运行这个可执行文件后,它会被装载到内存中,接着 CPU 会执行程序中的每一条指令,那么这个。
2024-02-08 23:38:41
1513
原创 windows编程-网络编程
/ 1 定义和配置窗口对象//定义交互响应//回调//定义窗口代号//回调MyWinProc是我们的自定义函数,我们将这个函数回调到这个窗口对象中,将操作和窗口联系在一起(3)注册窗口类虽然我们定义了一个窗口,但是系统并不知道这个窗口的存在,所以接下来我们通过RegisterClass()函数来注册窗口类。
2024-01-16 22:14:51
2617
原创 动态规划-背包问题
有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是o(2^n),这里的n表示物品数量。所以暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!思路:本体如何化为背包问题是解题的关键和难点,这里我试想过用一个背包装2个元素这样的思路来想,想了半天都想不通,
2024-01-08 13:53:03
1308
原创 数据结构与算法-构造数据结构
在双指针章节遇到过单调队列,但是理解较浅,这里进行重新解读和分析:单调队列就是一个「队列」,只是使用了一点巧妙的方法,使得队列中的元素全都是单调递增(或递减)的,这一点和单调栈很像。给你一个数组window,已知其最值为A,如果给window中添加一个数B,那么比较一下A和B就可以立即算出新的最值;但如果要从window数组中减少一个数,就不能直接得到最值了,因为如果减少的这个数恰好是A,就需要遍历window中的所有元素重新寻找新的最值。
2023-10-26 21:12:43
116
原创 图论-概述
首先也是很重要的一点,我们需要知道图就是多叉树的延申图的抽象结构为如下:(与多叉树很像)但是一般不使用这种结构存储图,而是使用邻接表和邻接矩阵来实现: 代码实现:1.2 图遍历框架-DFS框架我们能体会出来,dfs和回溯其实是非常相似的,下面给出回溯与dfs的对比代码:回溯:dfs:可以看出dfs和回溯其实代码一模一样,只是处理问题不同,选择列表不一样而已我将上述dfs框架当作一般框架,另外还发现了一种dfs的框架,代码如下:可以看出这段代码和一般框架的区别在于我们对节点
2023-10-20 21:41:15
420
1
原创 数据结构与算法-暴力搜索之BFS
3:我们如何排除死亡数字,其实这里的死亡数字就是1.3中的障碍坐标,只是由于每一数字都是一个字符串,我们不能直接定位,需要用一个数据结构来查询是否遇到了障碍,存放障碍其实用什么都行,但是查询时使用比如数组会非常麻烦,那么我们考虑使用set(因为不需要返回查询结果的下标,不使用map)4:如何判断最短选择次数,因为每条路径都是相对权重(长度),所以bfs第一次访问到的target时就是最短路径,问题时在何时进行计数,一开始我错误的将sum++放在了取cur的时候。为什么这样能够能够提升效率呢?
2023-10-16 21:46:16
309
1
原创 数据结构-二叉树-总结
如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值,这叫「分解问题」的思维模式。这个思路是类似通解的思路,有些题存在一些比较巧妙的做法不归入其中,但绝大多数题目都能用这种思想解决。
2023-09-30 21:08:44
577
1
原创 数据结构-栈和队列-总结
首先大家要知道 栈和队列是STL(C++标准库)里面的两个数据结构。C++标准库是有多个版本的,要知道我们使用的STL是哪个版本,才能知道对应的栈和队列的实现原理。接下来介绍的栈和队列也是SGI STL里面的数据结构, 知道了使用版本,才知道对应的底层实现。来说一说栈,栈先进后出,如图所示:栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,
2023-09-04 22:35:41
95
1
原创 数据结构-链表-总结
单链表有两种构造方式,一种是使用虚拟头节点,一种是不是虚拟头节点;使用虚拟头节点可以使得对头节点操作和后面一致,因此后面都使用虚拟头节点创建;
2023-09-03 10:24:45
159
原创 数据结构-数组-总结
我们让慢指针slow走在后面,快指针fast走在前面探路,找到一个不重复的元素就赋值给slow并让slow前进一步。这样,就保证了都是无重复的元素,当fast指针遍历完整个数组nums后,就是整个数组去重之后的结果。当需要删除的元素出现后,慢指针停一步,这样每次nums[slowIndex++] = nums[fastIndex];就会覆盖前面的数达到删除的目的。
2023-08-31 21:37:55
122
原创 linux系统编程-进程通信
再来,消息队列是保存在内核中的消息链表,在发送数据时,会分成一个一个独立的数据单元,也就是消息体(数据块),消息体是用户自定义的数据类型,消息的发送方和接收方要约定好消息体的数据类型,所以每个消息体都是固定大小的存储块,不像管道是无格式的字节流数据。消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销,因为进程写入数据到内核中的消息队列时,会发生从用户态拷贝数据到内核态的过程,同理另一进程读取内核中的消息数据时,会发生从内核态拷贝数据到用户态的过程。管道,由于没有名字,只能用于亲缘关系的进程间通信。
2023-07-26 11:43:50
127
1
原创 linux系统编程-进程控制
我们平时写的 C 语言代码,通过编译器编译,最终它会成为一个可执行程序,当这个可执行程序运行起来后(没有结束之前),它就成为了一个进程。程序是存放在存储介质上的一个可执行文件,而进程是程序执行的过程。进程的状态是变化的,其包括进程的创建、调度和消亡。程序是静态的,进程是动态的。
2023-07-25 17:13:49
209
原创 linux系统编程-linux下c/c++开发流程
1. vim使用参考博客 3-5 章:vim使用2. gcc编译链接参考博客的前两章:gcc编译链接部分3.静态链接和动态链接3.1 静态库链接1:将各个库对应的.c/.cpp源文件编译为.o文件2:用ar rcs 将.o文件链接为.a文件3:把头文件和.a文件一起发给用户,用户可以通过自己编写main函数调用库(把main.c编译为.o文件)3.2 动态库链接1:用-fpic -shared代替-c将源文件编译为.so文件gcc -fpic -shared 众多源文件名 -o
2023-07-13 11:00:26
809
1
原创 操作系统- 硬件结构
CPU 在读写数据的时候,都是在 CPU Cache 读写数据的,原因是 Cache 离 CPU 很近,读写性能相比内存高出很多。对于 Cache 里没有缓存 CPU 所需要读取的数据的这种情况,CPU 则会从内存读取数据,并将数据缓存到 Cache 里面,最后 CPU 再从 Cache 读取数据。写直达,只要有数据写入,都会直接把数据写入到内存里面,这种方式简单直观,但是性能就会受限于内存的访问速度;
2023-07-12 21:25:09
167
1
原创 数据结构-哈希表-总结(简)
用数组当成哈希表,数据当作下标,把nums[i]用于计数,先计第一个string,用++,再计第二个string,用- -;1:一般为减少时间开支,在最后一个for循环里面,一边遍历,判断存放数据,一边就判断时候输出,能少用一个循环2:待定(二刷说不定有新体会)
2023-06-25 19:45:14
295
1
原创 数据结构-哈希表-总结
1:.size()是容器或者字符串使用的2:数组初始化方式// 所有元素初始化为 0必须指定大小3:时间复杂度为3次O(n)->O(n)4:本题使用数组构建哈希表是因为数据大小已知了,若未知要用其他的数据结构时间复杂度: O(mn)空间复杂度: O(n)使用数组和set的优劣:直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。不要小瞧 这个耗时,在数据量大的情况,差距是很明显的。时间复杂度: O(logn)
2023-06-25 11:54:47
1275
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人