
算法专题
qwe954443563
这个作者很懒,什么都没留下…
展开
-
图的学习(三)——BFS与DFS
1.图的广度优先搜索图的遍历:从图中某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次。广度优先搜索(1)首先访问起始顶点v;(2)接着由出发依次访问v的各个未被访问过的邻接顶点w1w_1w1,w2w_2w2,…,wtw_twt;(3)然后依次访问w1w_1w1,w2w_2w2,…,wtw_twt的所有未被访问过的邻接顶点;(4)在从这些访问过的顶点出发,访问它们所有未被访问过的邻接顶点;(5)…,以此类推;#define MAX_TREE_SIZE原创 2020-12-23 16:31:55 · 637 阅读 · 0 评论 -
广度优先搜索实例讲解
1. 力扣101题c++代码如下:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: bool isSymme原创 2020-12-15 14:47:53 · 338 阅读 · 0 评论 -
广度优先搜索解题技巧
广度优先搜索(BFS)是按层的概念进行的搜索算法,利用Quene记录需要被展开的TreeNode。广度优先搜索解题模板:(1)初始化队列(通常加入根结点)(2)当队列非空时:pop出队列中的所有值(当前层,需记录size);并分别对pop出的每个值的左孩子和右孩子添加进队列(这里先添加左孩子还是右孩子是根据题目来的);增加层数;将相应的元素添加进最终结果中;注意:一定是先将当前层的所有结点元素pop出去(因此需要size记录当前层的元素数量),而不是不断地pop元素出去,因为可以知道,在po原创 2020-12-15 10:17:31 · 278 阅读 · 1 评论 -
串的学习(一)-朴素模式匹配算法
1.串与线性表的区别串是一种特殊的线性表,数据元素之间呈线性关系。它与线性表的不同是线性表中的数据元素可以存放任意的数据元素,而串中数据元素只能存放字符集(中文字符、英文字符、数字字符、标点字符等)。串的增删改查通常以子串为数据对象。2.字符集编码字符集:英文字符-ASCII字符集(只含有英文字符),对于一个英文字母来说,一个英文字母占1B。中英文-Unicode字符集(既含有英文字符,又含有中文字符)Unicode字符集编码方式有UTF-8和UTF-16等编码方案(编码方案可看作字符集的加工函原创 2020-12-10 10:22:00 · 470 阅读 · 0 评论 -
Stack栈的解题技巧
Stack栈特点:需要回顾之前的状态,且只需要回顾某个状态一次即可。特性:LIFO(Last In First Out)适用于需要记录之前的状态,必要的时候可以找回之前的状态,或者利用之前的值不像array,不可以采用index访问,每次只能拿栈顶元素。动态规划与栈的区别动态规划是记录之前所有的状态,随时可以访问任何一个子问题,所有通常采用Array和HashTable,而且不会回到之前的状态,只会利用之前的值。Stack:每次只需要栈顶元素,并且每个状态只会被用**O(1)**次。栈的原创 2020-12-06 15:43:32 · 168 阅读 · 0 评论 -
队列的应用
1. 队列的应用-树的层次遍历对于树结构,当从根结点开始访问时,将根结点放入队列中,并将其子结点放入队列的队尾,并将该结点从队头弹出;不断循环这个过程,直至所有节点被访问完全。2. 队列的应用-图的广度优先遍历图的广度优先遍历:首先从任一结点出发,将其放入队列中,然后访问该节点的邻居结点,并将其放入队列的尾部,同时将该结点标记为已参观结点;然后依次对队列中的每个结点进行上述操作,最终可以实现图的广度优先遍历。3. 队列在操作系统中的应用操作系统处理多个多个进程:LILO(先进先出去)打印数据原创 2020-12-06 14:39:51 · 1564 阅读 · 0 评论 -
栈的应用(三)-栈在递归中的应用
函数调用栈:最后被调用的函数最先执行结束。函数调用的特点:后进先出(LIFO)函数调用时,需要一个栈存储,存储内容有:(1)函数返回地址(2)实参(3)局部变量每进入一层递归,就将递归调用所需信息压入栈顶。每弹出一层递归,就将弹出相应信息。递归算法:使用递归时可能包含很多次重复计算。太多层递归可能导致栈溢出。...原创 2020-12-06 14:27:08 · 1070 阅读 · 0 评论 -
栈的应用(二)-在前缀(后缀)表达式中求值
1. 后缀表达式(逆波兰表达式)运算符在两个操作数后面中缀转后缀的手算方法:(1)确定中缀表达式的各个运算符的运算顺序(2)选择下一个运算符,按照【左操作数 右操作数 运算符】的方式组合成一个新的操作数(3)如果还有运算符没被处理,就继续(2)注意:由于运算顺序不唯一,因此对应的后缀的表达式也不唯一但对于计算机来进行转化的话,只会产生第一种结果,因为算法的确定性,一种输入只能产生一种输出。计算机中缀转后缀的原则:左优先原则。左优先原则:只要左边的运算符能先计算,就优先算左边的。后缀表原创 2020-12-06 14:10:13 · 1010 阅读 · 0 评论 -
栈的应用(一)-括号匹配问题
注意点(1)当扫描到右括号时,需要判断下栈是否为空;(2)当扫描完还未发现错误时,需要判断下栈是否为空,当栈为空时,此时左括号多了,也是不匹配的。c++代码如下:#define MaxSize 10typedef struct SqStack{ int data[MaxSize]; int top;//栈顶指针,存放着从栈底开始的栈顶元素的值的下标值。};void InitStack(SqStack &S);//初始化栈bool PushStack(SqStack &S原创 2020-12-06 09:31:29 · 189 阅读 · 0 评论 -
链表解题实例
链表解题实例1.力扣92.反转链表II本题采用递归法求解。其c++代码如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* successor = NULL原创 2020-12-04 14:33:58 · 114 阅读 · 0 评论 -
链表题型解题技巧
链表解题模板:1.双指针法(可以解决大约百分之60的题目)两个关键点:由于链表是同向的,因此双指针法的不同主要在下面两点(1)双指针的起始距离(2)双指针的移动速度根据上述的一个或两个不同可以找到链表的中位数、链表的倒数第n个数等。2.递归法(recursion)递归法三个关键步骤:(1)询问子问题的解;(注意此时将子问题想象成一个黑盒子,不用思考其内部结构,跳出来想)(2)在当前递归层做满足题目要求的事情;例如反转链表时,需要将指针的指向进行变换。(3)返回当前层的结果。之所以采用原创 2020-12-03 13:19:23 · 338 阅读 · 0 评论 -
回溯算法-切割问题
回溯算法-切割问题力扣131题同样地按照回溯三部曲进行代码编写:回溯三步曲:1.递归函数参数和返回值2.确定终止条件3.单层递归逻辑1.递归函数参数和返回值void backtracking(nums,start_index,result,path)2.确认终止条件该题的终止条件为叶子节点恰为空结点,此时判断条件可以转化为if (start_index==nums.size):result.append(path);return;3.单层递归逻辑for (i=start_ind原创 2020-12-02 15:08:34 · 432 阅读 · 0 评论 -
回溯算法-排列问题
回溯算法-排列问题回溯三步曲:1.递归函数参数和返回值2.确定终止条件3.单层递归逻辑力扣46题1.递归函数参数和返回值void backtracking(nums,path,used,result)2.终止条件if (path.size==nums.size)result.push(path)return;3.单层递归逻辑for (i=0;i<=nums.size;i++){if nums[i] not in used:path.push(nums[i]);used原创 2020-12-02 10:15:00 · 158 阅读 · 0 评论 -
回溯算法-组合问题
**回溯搜索法-**纯暴力搜索,不是一种高效的算法。但因为有些问题能够通过回溯法解决已经很棒了,回溯法比那种通过多层循环的效率还是要高很多的。回溯法均可抽象为一个N叉树形结构,这个树的宽度是这个集合所有的元素,深度为递归的深度。如下图:回溯三步曲:1.递归函数参数和返回值2.确定终止条件3.单层递归逻辑回溯法模板:void backtracking(参数值)//回溯法参数不容易确定,一般先写逻辑,需要什么参数,就写什么参数。{if(终止条件)://有递归就一定有终止条件收集结果;re原创 2020-11-30 15:50:10 · 838 阅读 · 0 评论 -
时间复杂度与空间复杂度
时间复杂度算法时间开销与问题规模 的关系T(n),常用大O表示法表示算法复杂度分析比较O(1)<O(log2n\log_2^nlog2n)<O(n)<O(nlog2n\log_2^nlog2n)<O(n2n^2n2)<O(n3n^3n3)<O(2n2^n2n)<O(n!)<O(nnn^nnn)算法时间复杂度满足规则1.加法规则:O(f(n))+O(g(n))=O(max((f(n),g(n)))2.乘法规则O(f(n))*O(g(n))原创 2020-11-20 14:12:41 · 214 阅读 · 0 评论 -
算法的基本概念
算法的基本概念什么是算法程序 = 数据结构 + 算法;数据结构是要将现实生活中的信息存储到计算机的数据元素中;算法是处理信息的步骤;算法的五个特性1.有穷性2.确定性3.可行性4.输入5.输出好算法的特性1.正确性2.可读性3.健壮性4.高效率、低存储...原创 2020-11-20 10:25:05 · 135 阅读 · 0 评论 -
动态规划:0-1背包问题
动态规划:0-1背包问题前言一、什么是0-1背包问题?二、什么是动态规划三、利用动态规划解决0-1背包问题总结前言背包问题是一种经典的动态规划求解问题,本文主要以经典0-1背包问题为例,阐述动态规划思想,求解背包问题,希望能够帮助到大家一、什么是0-1背包问题?背包问题指的是,存在一系列物品w1,w2,…,wn,物品数量存在n个,其中每个物品对应的价值为v1,v2,…,vn;此时需要将其装入一个承载量为weight的背包中,由于背包是存在一定的承载量的,因此在保证背包的承载量的条件下,我们希望原创 2020-08-14 17:18:16 · 471 阅读 · 0 评论 -
动态规划
动态规划心得及步骤动态规划是一种求解最优解的算法,适用于将求解大的复杂的问题的最优解分解成求解若干简单的子问题的最优解,并通过将子问题的最优解存储到状态变量中,从而减小时间复杂度。动态规划类似于递归方法,它与递归方法的区别就在于它存储着子问题的最优解,而不是像递归方法一样,不断重复计算相同状态值,减少计算复杂度。动态规划动态规划可以分为如下几个步骤:状态变量的定义 :只有定义了合适的状态变量的物理意义,才能够将复杂问题转化为若干简单子问题;状态变量的定义需要通过多做练习练习,熟悉其定义规则。状态原创 2020-08-12 16:26:05 · 213 阅读 · 0 评论