算法
文章平均质量分 84
算法学习
progressiveFighting
这个作者很懒,什么都没留下…
展开
-
二叉树的递归套路
树型dp原创 2022-09-13 19:54:26 · 279 阅读 · 0 评论 -
排序算法总结
排序总结原创 2022-07-28 21:27:39 · 159 阅读 · 0 评论 -
图的基本算法
基础知识图就是边和点的集合任何图都可以看做是有向图图的表示方式两种表示方法:邻接表和邻接矩阵最常用的表示方法是用二维数组表示:每一行第一个表示边的权重,第二个表示from结点的值,第三个表示to结点的值点的结构class Node {public: int value; int in;//入度 int out;//出度 list<Node*>nexts;//邻居结点(只包括由本身指向的结点) list<Edge*>edges;//从本身指出的边 Node(i原创 2022-04-01 22:07:01 · 393 阅读 · 0 评论 -
堆的基础学习
题目给定很多线段,每个线段都有两个数[start, end],表示线段开始位置和结束位置,左右都是闭区间。规定:1)线段的开始和结束位置一定都是整数值2)线段重合区域的长度必须>=1返回线段最多重合区域中,包含了几条线段例:有三个线段,[1,2],[2,3],[1,3],其中[1,2]和[1,3]重合或者[2,3]和[1,3]重合,所以返回2,但是[1,2]和[2,3]不重合(因为重合的长度是0)分析:解1 暴力方法先找出所有线段中开始位置的最小值minStart和结束位置的最大值原创 2022-03-31 20:27:28 · 2225 阅读 · 0 评论 -
并查集-初步了解
基础知识并查集:维持许多集合的数据结构假设有6个集合:{a},{b},{c},{d},{e},{f}bool isSameSet(a,e):查询两个元素是否在一个集合初始:每个集合都只有一个元素,所以指针都指向本身。设两个指针分别指向a,e,然后指针后移到末尾(把它称为代表结点),若两个指针的指向一致,则在一个集合里。void union(a,e)a所在集合的全体和e所在集合的全体合成一个集合比较a所在集合的元素个数和e所在集合的个数,小集合的末尾指向a两个重要优化:1.合并时是小的原创 2022-03-22 22:32:59 · 3149 阅读 · 0 评论 -
暴力搜索——回溯
理论回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案。一般可以解决如下几种问题:组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集排列问题:N个数按一定规则全排列,有几种排列方式棋盘问题:N皇后,解数独等等组合是不强调元素顺序的,排列是强调元素顺序。因此组合无序,排列有序。例题77. 组合回溯就是递归,所以按照递归三部曲来做参数:n,k固定参数,startIndex,从startindex开原创 2022-03-12 17:45:34 · 2102 阅读 · 0 评论 -
滑动窗口模板
滑动窗口模板/* 滑动窗⼝算法框架 */void slidingWindow(string s, string t) { unordered_map<char, int> need, window; for (char c : t) need[c]++; int left = 0, right = 0; int valid = 0; while (right < s.size()) {//左闭右开区间 // c 是将移⼊窗⼝的字符 char c = s[right];原创 2022-03-06 21:38:01 · 186 阅读 · 0 评论 -
【暴力递归之从左往右的尝试模型】
尝试模型什么是尝试?尝试是方法,是解题的步骤,也可以说尝试就是暴力递归,但是所有的动态规划都来自于暴力尝试,所有说尝试是解题的关键。本篇介绍第一个模型。从左往右的尝试模型子串:要求字符之间是连续的子序列:不要求连续例如“abc”的子串有“a”,“ab”,“abc”,“b”,“bc”,"c"这六个而子序列:abc,ab,ac,a,bc,b,c, 空串。ac表示子串,是子序列。如何打印子串?这个简单都不需要递归,三层循环就好了,外层循环确定子串开始位置,内层循环确定子串结束位置,最里面的一层保原创 2022-02-21 22:03:09 · 790 阅读 · 0 评论 -
螺旋矩阵之一套代码过三道题目
这篇博客讲解一下如何用一套代码过三道螺旋矩阵的题目先看第一道54. 螺旋矩阵首先要明确螺旋的循环方向:右下左上……,其次明确上下左右边界。明确这两点就不难做了一次循环一个方向就填一个值,这样就不会乱了class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int>re; int xn原创 2022-02-18 14:00:01 · 306 阅读 · 0 评论 -
【算法笔记】二叉树应用
226. 翻转二叉树解1 这其实也是层序遍历的应用,遍历每一层是先交换结点的左右孩子,然后将非空的左右结点入队。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * Tr原创 2022-02-11 18:05:49 · 657 阅读 · 1 评论 -
【算法笔记】前缀树
前缀树也叫字典树,是一种树性结构,核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。应用如下:快速查找某一字符串是否存在,字典树的查询时间复杂度是O(logL),L是字符串的长度。计算以某一字符串为前缀的字符串个数词频统计前缀树结点的定义如下:class TrieNode {public: int pass;//表示字符串通过该结点的次数 int end;//以该结点为结尾的字符串个数 vector<TrieNode*>next;//用原创 2022-02-08 19:29:01 · 606 阅读 · 0 评论 -
【算法笔记】二叉树之基础遍历
基础知识一. 二叉树的种类二叉树主要分为满二叉树、完全二叉树满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。深度为k的满二叉树,有2k-1个节点。完全二叉树:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h -1 个节点。二叉搜索树树上加上数值就是二叉搜索树,二叉搜索树是一个有序树。若它的左子原创 2022-01-29 11:26:12 · 1121 阅读 · 1 评论 -
【算法笔记】栈与队列
栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。栈的底层实现可以是vector,deque,list , 主要就是数组和链表的底层实现。std::stack<int, std::vector<int> > third; // 使用vector为底层容器的栈...原创 2022-01-27 19:34:40 · 965 阅读 · 0 评论 -
【算法笔记】字符串
例题344. 反转字符串双指针,left指向最左边,right指向最右边,交换left和right的位置,直到left>=right.c++的reverse()就是字符串翻转函数。class Solution {public: void reverseString(vector<char>& s) { int left=0; int right=s.size()-1; while(left<right ){原创 2022-01-23 10:44:49 · 439 阅读 · 1 评论 -
【算法笔记】哈希表
基础知识哈希表定义:哈希表是根据关键码的值而直接进行访问的数据结构。哈希表就是数组。哈希表中的关键码就是数组的索引下标,然后通过下标直接访问数组中的元素应用场景:一般哈希表都是用来快速判断一个元素是否出现集合里。例如查询一个名字是否在这所学校里。,用哈希表时间复杂度O(1)。哈希函数,把学生的姓名直接映射为哈希表上的索引,然后就可以通过查询索引下标快速知道这位同学是否在这所学校里。哈希碰撞:两个学生映射的索引一样。解决方法:1. 拉链法:将发生碰撞的学生存在链表2. 线性探测法:前原创 2022-01-20 19:27:28 · 391 阅读 · 0 评论 -
【算法笔记】链表
203. 移除链表元素链表删除:对于单结点,需要找到删除结点的上一个结点,由于头结点没有上一个结点,可以采取以下两种方法。1.对头结点特殊处理ListNode* removeElements(ListNode* head, int val) { while(head!=nullptr&& head->val==val){ ListNode* temp=head; head=head->next;原创 2022-01-17 10:26:04 · 574 阅读 · 1 评论 -
【算法笔记】数组篇-双指针以及滑动窗口
27. 移除元素分析:解1 暴力解法:从前往后遍历,遇到相等的就整体往前 int removeElement(vector<int>& nums, int val) { int len=nums.size(); for(int i=0;i<len;i++){ if(nums[i]==val){ for(int j=i;j<len.原创 2022-01-14 16:38:05 · 582 阅读 · 0 评论 -
【算法笔记】数组篇-二分查找
二分查找前提是数组有序(假设数组非递减排列)步骤:设左右指针left,right找出中间的位置,如何判断该位置的值是否等于target若nums[mid]==target,则返回该位置下标若nums[mid]>target,则right=mid-1若nums[mid]<target,则left=mid+1mid的求法:mid=left+(right-left)/2或mid=left+((right-left)>>1)注意:算数运算符的优先级比移位运算符高。对原创 2022-01-12 11:54:25 · 752 阅读 · 4 评论