摘要:5.24 dfs深度优先搜索: 思想比较简单,就是一条路走到底,走到最深点处再回退一步,再看有没有路可以走,没有的话再回退一步,重复此步骤; 也是人们常讲的暴搜。 主要的用法: 通常需要一个状态数组来记录每次走路时侯的状态,如果走过就将他变成true,再走完之后,需要回头的情况就需要将其变成原来状态
阅读全文
05 2022 档案
摘要:5.22 字符串hash: 字符哈希串的意思 其实就是将字符串的前缀转换为数来存值由于每位的权值是不一样的 所以每个前缀值都对应着唯一的一种字符串; 主要用途:字符串/数据的比较,是kmp的一种替代;(kmp可以额外计算结点,其余比较相同都可以用字符串hash;很强! 核心思想:通过映射公式将对应的
阅读全文
摘要:5.21 哈希表 Hash表又称为散列表,一般由Hash函数(散列函数)与链表结构共同实现,与离散化思想类似。 一般要求:防止冲突,便于查询 模拟hash表: 拉链法:两个核心操作insert(),find(); int h[N], e[N], ne[N], idx; //邻接表进行存储; void
阅读全文
摘要:5.20 前言吐槽: 今天是5.20啦,但是作为单身修狗的我只能和代码过啦。。。继续加油算法打卡!!! 堆排序: 堆就是一棵完全二叉树 二叉堆是一种支持插入,删除,查询最值的数据结构。他其实是一棵满足"堆性质"的完全二叉树,树上的每个节点带有一个权值。若树中的任意一个节点的权值都小于等于其父节点的权
阅读全文
摘要:5.19 Trie树: 用处:快速的查找和高效存储字符串集合的数据结构。 类似如此的查找,存储 其简单的两个操作:插入和删除 插入: void insert(char str[]) { int p; //定义数据前一位的位置 for (int i = 0; i < str[i]; i++) { in
阅读全文
摘要:5.18 kmp算法 核心思想:在每次失配时,不是把p串往后移一位,而是把p串往后移动至下一次可以和前面部分匹配的位置,这样就可以跳过大多数的失配步骤。而每次p串移动的步数就是通过查找next[ ]数组确定的。 成员变量:ne[]记录的匹配数组;双指针i,j; KMP主要分两步:求next数组、匹配
阅读全文
摘要:5.17 记一次错误: Segmentation Fault-> 如果开辟数组的大小比题意中的小可能出现此错误 单调队列: 队列满足先进先出的规则; 单调队列则又同时满足单调的规则; 可用来解决某一个区间的最小值,也是滑动窗口的典型案例 题目链接:154. 滑动窗口 - AcWing题库 #incl
阅读全文
摘要:5.16 双链表: 即有左节点右节点的链表 算法题中主要的声明方式: int l[N],//向左边的结点 e[N],//存储的值 r[N],//右边的结点 idx;//变量指针 void init() { l[1] = 0; r[0] = 1; idx = 2;//初始有两个被占有,也导致后面找到k
阅读全文
摘要:5.15 静态单链表 简单的方法: 成员变量: int e[N],//存放节点的值 ne[N],存放结点的next head,头结点指针 idx;变化的指针 初始化: void init() { head = -1;//头结点最初指向-1 idx = 0;//初始的位移指针是0; } //初始化链表
阅读全文
摘要:5.12 区间合并问题: 题目描述:给出n段区间,如果区间内,l -r存在交集,那么就可以合并,需要更新区间,如果不存在交集,那么就直接将单独的区间个数++,最后返回区间合并后的区间个数 解题思路: 将区间通过pair进行归类,并排序(可以去除包含的区间,并且可以从小到大排序也方便进行插入,计数);
阅读全文
摘要:5.11 离散化: 离散化的本质,是映射,将间隔很大的点,映射到相邻的数组元素中。减少对空间的需求,也减少计算量。 通过离散化可以处理哪种题目:给出的数组位置太大。 例题: 首先,通过这个区间和,可以想到的是前缀和相加减; 其次,要求找某个位置的数,可以通过二分查找来找到想要的数 具体做法思路: 主
阅读全文
摘要:5.10 双指针算法 一般都是先有暴力直接解法的情况下进行优化,最常用的有滑动窗口,将字符串换行,将原来o(n2)的复杂度降为o(n); 特别注意:这里的双指针一般是有序的,而且存在单调性;如果没有序,建议先sort, 双指针分为两种情况:两条路径,还有一条路径对碰指针; 例题 给定一个长度为 n
阅读全文
摘要:5.8 差分数组: 主要公式思想: 差分就是求前缀和的逆向,b[i]=a[i]-a[i-1];就是a是后面的减去前面的就是差分 b[i] = a[i] - a[i - 1];//构造差分数组 a[i]= b[i]+a[i-1];//还原差分数组 差分矩阵: 主要思想: 二维差分矩阵的构造: b[i]
阅读全文
摘要:5.7 一维前缀和 主要思想; 初始化前缀和数 由于存在s[i] =s[i-1]+a[i];s是前缀和,a[i]是每一位的数;所以需要将i从1开始读入所有的数 for (int i = 1; i <= n; i++) { s[i] = s[i - 1] + q[i]; } //求区间的前缀和 cou
阅读全文
摘要:5.6 继续打卡模板题; 高精度加法 主要思想: 我们人都是从个位依次往高位算,同理,这里从个位开始,然后通过一个借记点进行进位; #include "bits/stdc++.h" using namespace std; string a, b; vector<int> sum(vector<in
阅读全文
摘要:5.5 快速排序模板类型 主要思想:分治; 对于这种边界容易出错的,直接背过模板就好 这里是需要先找出x分界点对其进行比较,然后比较,最后递归, void quick_sort(int q[], int l, int r) { if (l >= r)//如果左边大于有右边那么不符合条件,退出 ret
阅读全文
摘要:由于种种原因,只能放弃java,从头开始c++的算法学习了,坚持打卡
阅读全文
摘要:5.4 两两交换链表中的节点 迭代方法: 这里需要四个指针,第一个指针记录开始的位置,最后返回出去,另外三个则需要在循环中位移和转换链表结点的方向 第一个临时结点,dummy 数值位0;即虚拟结点,dummy.next = head; 第二个结点pre是dummy同位置开始的结点,用来改变下一个结点
阅读全文
摘要:day03 移除链表元素 如果链表本身就是空,直接返回 如果是头结点就是要删除的元素;那么就直接将head的值放到下一位,head.val == val是他的执行的条件 如果是普通的移除;那么就直接创建两个临时结点tem =head; cur = head.next 当cur.val==val时候,
阅读全文
摘要:5.2 移除元素 方法1: 暴力循环 循环一遍所有的数; 如果碰到了等于目标值的时候,那么就将所有值都向前移动一位,直到所有数据结尾 每次移动的时候,将循环的次数进行一次减少,即i--;同时,所有里面的数也需要减减 class Solution { public int removeElement(
阅读全文
摘要:5.1 二分查找 主要思路:左变量,右变量,中间变量 易错点,这里我只写一种left<right 具体做法:如果mid小于target;left+1变成mid;否则right变成mid; class Solution { public int search(int[] nums, int targe
阅读全文