数据结构与算法
文章平均质量分 90
分享自己在学习数据结构过程中的“心动历程”。记录初学时的问题和感想。随着学习的不断深入,博客内容也会继续完善、更新。
WuShF.top
22级本科生,蒟蒻也有ACM梦,目标全栈,在学,共勉。
展开
-
Acwing二分和前缀和(一)
左端点的判断条件是mid>=x,因为是升序的,如果成立,说明左端点l只会在mid上或mid左侧。将右端点调整为mid,这样mid只会不变或变小。现在变小了,说明目前的l并非答案的左区间,中间掺杂了更小的数列,此时需要使左区间l+1。左端点是通过l查找,l从0累加,不会产生遗漏。左端点确定之后,右端点从n-1,也就是最右端开始,累减,确定答案的右端点。原创 2024-02-13 22:40:47 · 845 阅读 · 1 评论 -
力扣5-最长回文子串
力扣5-最长回文子串原创 2023-02-18 21:00:48 · 182 阅读 · 6 评论 -
Acwing枚举、模拟与排序(二)
几道“模拟“题原创 2024-03-07 17:17:37 · 849 阅读 · 0 评论 -
力扣6-N 字形变换&力扣9- 回文数
分享一道力扣简单题和一道力扣中等题,对我这个萌新来说还是有点门槛的(哭)原创 2023-02-20 23:14:27 · 1739 阅读 · 15 评论 -
Cracking the Safe
想了好几天的图论题原创 2024-08-31 02:00:27 · 520 阅读 · 0 评论 -
力扣12&13-整数与罗马数字互换
使用C语言解决,整数与罗马数字的互换问题原创 2023-02-22 19:41:04 · 952 阅读 · 8 评论 -
Acwing枚举、模拟与排序(一)
几道“模拟”题原创 2024-03-02 15:09:04 · 809 阅读 · 1 评论 -
Acwing数学与简单DP(二)
集合的角度分析DP原创 2024-02-28 12:19:00 · 921 阅读 · 2 评论 -
力扣7-整数反转&力扣8-字符串转换整数 (atoi)
介绍两道力扣题的解题思路,两道题都包含了判断整型是否溢出的问题,两道题都很有意思:看着很简单,实际上并不容易通过,当然,也可能是我自己能力不到位,要敢于正视自己的问题,勤于总结,不断进步。原创 2023-02-19 22:07:42 · 249 阅读 · 8 评论 -
力扣16-最接近的三数之和&力扣18-四数之和
力扣16-最接近的三数之和&力扣18-四数之和原创 2023-02-24 16:19:51 · 853 阅读 · 10 评论 -
CSDN-猜年龄、纸牌三角形、排他平方数
CSDN-猜年龄、纸牌三角形、排他平方数原创 2023-03-19 19:52:10 · 556 阅读 · 3 评论 -
力扣3-无重复字符的最长子串
分享力扣上的解题记录,包含滑动窗口、哈希表、桶等方法原创 2023-02-16 22:55:02 · 114 阅读 · 2 评论 -
Acwing二分和前缀和(二)
这两种更新条件的结果是一样的。原创 2024-02-17 22:48:52 · 488 阅读 · 3 评论 -
最短编辑距离
最短编辑距离原创 2024-05-20 18:29:40 · 279 阅读 · 0 评论 -
力扣20-有效的括号&力扣22-括号生成
力扣20-有效的括号&力扣22-括号生成原创 2023-02-28 23:06:02 · 725 阅读 · 3 评论 -
力扣26-删除有序数组中的重复项
力扣26-删除有序数组中的重复项原创 2023-02-17 22:34:26 · 135 阅读 · 3 评论 -
【数位DP】数字计数
给定两个正整数𝑎和𝑏,求在[𝑎,𝑏]中的所有整数中,每个数码(digit)各出现了多少次。原创 2024-05-23 01:41:21 · 418 阅读 · 1 评论 -
CSDN三道简单题:合并检测、星期一、特别数的和
CSDN三道简单题:合并检测、星期一、特别数的和原创 2023-03-19 14:06:12 · 803 阅读 · 2 评论 -
力扣1-两数之和&力扣15-三数之和
力扣1-两数之和&力扣15-三数之和原创 2023-02-23 23:37:43 · 813 阅读 · 2 评论 -
Acwing递归与递推(一)
递归枚举原创 2024-01-27 18:29:20 · 866 阅读 · 1 评论 -
Acwing算法提高课-DP-数字三角形模型
DP数字三角形模型原创 2024-03-24 16:29:41 · 950 阅读 · 3 评论 -
CCPC赛后补题-线性基
菜就多练😭原创 2024-09-11 21:51:44 · 620 阅读 · 0 评论 -
(粗糙的笔记)动态规划
浅记有关动态规划的内容,有些潦草原创 2023-10-04 19:06:00 · 212 阅读 · 1 评论 -
【浅记】分而治之
浅浅地做个笔记原创 2023-10-02 14:17:35 · 154 阅读 · 0 评论 -
【基础算法】动态规划
动态规划与递归算法的相似之处在于他们都会将一个较大的问题分解为若干较小的问题,逐一求解后再汇聚成一个大的问题。不同之处在是永泰规划算法以自底向上的方式计算最优解,在计算过程中保存已解决的子问题答案,减少冗余的计算,从而提高算法效率。具备最优子结构具备子问题重叠性质当一个问题的最优解包含其子问题的最优解时,就称该问题具备最优子结构。在走楼梯问题中,F(n-1)和F(n-2)就是F(n)的最优子结构,因为F(n-1)和F(n-2)就是F(n)的最优解。在走楼梯中,我们将重叠的F(n-1)和。原创 2023-07-07 14:09:18 · 368 阅读 · 0 评论 -
【基础算法】贪心算法
找零钱中是递归地寻找剩余零钱允许的最大硬币。分薄饼是递归地寻找最小需求(人)的最小需求(饼)。广播站是递归地寻找能覆盖剩余未覆盖州的最大广播站。上面给的代码是用循环代替了层层调用。我们都可以尝试使用递归算法来解决。这并非偶然,这一递归特征已经隐含在贪心算法的定义中:不断地寻找局部最优解。如果将寻找局部最优解的过程封装为函数,在函数的结尾调用自身,寻找下一个局部最优解。那么就变成了一个递归算法。原创 2023-07-05 23:52:43 · 5036 阅读 · 2 评论 -
【基础算法】递归算法
分析问题求解的步骤,如梵塔问题,按照分析得到的步骤写算法即可。分析递归结束的条件,放到递归函数的前面,以便及时退出。尤其是第一点,我经常会有无从下手的情况,不知道怎么写,总想一步找到一个最优解。总结这三个递归算法之后,发现其实真就按照分析的思路来,把这些步骤转换成计算机语言就可以。递归挺费脑子的,还是得多练多总结。原创 2023-07-04 01:22:54 · 775 阅读 · 0 评论 -
【基础算法】穷举法
牺牲时间换取解的全面性。上面的三个问题都可以化为对整数解的方程组求解的问题。求解的过程就是对范围内的所有可能值进行尝试。尝试的时候需要注意重复解的问题。对于那些不限定顺序的题目,内层循环的计数器起始值可以尝试从+1开始。起始值从0开始还是从1开始,到哪里结束,要看实际问题,要看我们要遍历的是什么。在排序算法中,我们如果遍历的是下标,那就是从0开始,循环条件就是<=size-1。如果遍历的是下标,那就是从1开始,循环条件就是<=size。原创 2023-07-02 23:38:01 · 1295 阅读 · 0 评论 -
【排序算法】堆排序
堆排序是对线性序列的排序,而不是真的对一个完全二叉树进行排序,用完全二叉树的形式解释堆排序的过程是出于直观的需要。# include //传入数组、根节点索引、无序序列长度 void adjust(int num [ ] , int index , int n);//建树 for(int i = length / 2;i >= 1;i --) {//交换 int tmp = num [ i ];原创 2023-07-01 20:57:13 · 1299 阅读 · 0 评论 -
线性结构-数组
这两种定义方式是等价的,不过第一种更符合Java的编程规范。上面只是声明了一个引用变量array,其本质还是一个指针,而数组本身并不存在,也就是说在内存中还没有开辟那段连续的存储空间。要使用数组,必须先对数组进行初始化。Java中初始化数组有两种方法:静态初始化和动态初始化。静态初始化:定义数组时显式地指定数组的初始值,系统会根据初始值的个数和类型自动为数组在堆内存中开辟空间。//定义数组和初始化数组同时完成 int [ ] array1 = {原创 2023-05-09 21:17:14 · 1285 阅读 · 0 评论 -
线性结构-栈
前面说过,作为一个线性结构,栈既可以用数组实现,也可以用链表实现。在大多数情况下,我们用数组来实现栈。// 用数组实现一个栈 int top;// 栈顶索引,实际上就是栈顶位置的数组下标 int capacity;// 栈的容量 public MyStack(int capacity) {// 动态初始化栈,长度为capacity top = 0;// 栈顶索引为0,说明此时是空栈 this . capacity = capacity;// 初始化栈的容量 } //更多操作 }原创 2023-05-11 00:20:10 · 773 阅读 · 0 评论 -
线性结构-队列
队列的定义与普通的链表定义很相似,需要先定义队列的节点类,在定义队列类。int data;// 数据域,变量类型为int MyQueueNode next;// 指针域,指向下一个结点 public MyQueueNode(int data) {// 构造方法,在构造结点对象时将data赋值给this .data成员 this . data = data;} }是队列节点类型,与链表节点类Node相似。data:数据域成员变量next:指针域成员变量。原创 2023-05-12 00:03:25 · 578 阅读 · 1 评论 -
线性结构-链表
链表是由链表节点构成的,因此在定义链表结构之前,要先定义链表的节点类型。int data;Node next;//构造方法,在构造结点对象时将data赋值给this .data成员 } }在Java中,节点类可以放到链表类文件的最后。但在C/C++中,必须要先声明后使用,将节点声明在链表前面。定义即可在前也可以在后。data为整型的变量,是该链表节点的数据域,可以用来存放一个整数。next为Node类型的引用类型变量,是该链表节点的指针域,用来指定下一个节点。原创 2023-05-10 11:00:44 · 799 阅读 · 0 评论 -
数据结构-图结构
图Graph是由顶点(图中的节点被称为图的顶点)的非空有限集合V与边的集合E(顶点之间的关系)构成的。若图G中的每一条边都没有方向,则称G为无向图。若图G中的每一条边都有方向,则称G为有向图。前面已经说过,邻接表包含由顶点节点构成的数组以及依附于每个顶点的边链表。所以要实现邻接表,需要定义这两部分。先定义图的顶点类VNode,邻接表中顶点数组的元素就是该类的对象。// 顶点类型(数组中的结点类型) class VNode {int data;原创 2023-06-06 13:31:25 · 3726 阅读 · 4 评论 -
【排序算法】冒泡排序、选择排序、插入排序
外层循环控制轮数,总共执行n-1轮。内层循环控制每轮的比较次数,第i轮比较n-i次(i从1开始)。通过标记flag判断是否已经排序完成。C/C++//标记完成状态 char flag = 1;//比较n-1趟 for(int i = 0;i ++) {//将标记置为0 flag = 0;//计数器从0开始,每趟比较n-1-i次 for(int m = 0;m ++) {//将较大值置于数组右侧 if(ints [ m ] > ints [ m + 1 ]) {原创 2023-06-23 14:53:22 · 744 阅读 · 2 评论 -
【数据结构】【算法】二叉树、二叉排序树、树的相关操作
二叉树或者为空,或者由一个根节点加上根节点的左子树和右子树组成。要求左子树和右子树互不相交,且同为二叉树。显然,这个定义式是递归形式的。二叉树的每个节点至多有两个孩子节点,其中左边的孩子节点被称为左孩子,右边的孩子节点被称为右孩子。原创 2023-05-13 20:40:20 · 1514 阅读 · 5 评论