![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
文章平均质量分 81
liazylee
这个作者很懒,什么都没留下…
展开
-
算法之回溯法(一)
文章目录回溯法(backtracking)回溯法的使用场景题目实例1. 数字的全排列问题分析2. 数字的全排列题目分析3. 括号生成问题分析 回溯法(backtracking) 对于有些组合问题,初次看感觉可以用dp方法来解决,但是不能保证在多项式时间内解决问题的已知数据结构,类似dp转移方程式不是线性的,需要回溯来解决问题。这时候需要遍历所有潜在的答案,也就是穷举。 所以穷举法需要遍历所有可能的答案来找到一个解,如果不满足某个条件就需要返回上一个节点,尝试另一个分支。因此,这种方法叫“回溯法”。通常套用的原创 2022-04-28 14:56:47 · 104 阅读 · 0 评论 -
数据结构之链表(一)
数组跟链表 数组跟链表是都是一维的数据结构,因此经常一起对比学习, 数组(arry)是顺序存储结构 按顺序存储到一个连续固定空间的内存上;所以扩容时空间大小需要手动改动。不便于修改。 链表(linked list)是用指针连接元素的链式存储结构,不要求连续。查找不方便。 数组查询访问速度快为O(1),插入删除效率慢为O(n)。 链表则相反,链表查询慢O(n),插入删除为O(1)。 存储形式 储存[1,2,3,4,5] 这些值,在数组跟链表表现分别为下图。 代码表现 数组 a=[1,2,3,4,5] #原创 2022-03-29 13:52:58 · 78 阅读 · 0 评论 -
算法之递归(一)
递归(recursion) 递归是一个循环类型,不过不是for循环,而是一个函数自己去调用自己,形成一个循环。类似数学公式,例如斐波那契函数,F(n)=F(n - 1)+F(n - 2) (n ≥ 2,n ∈ N*)很容易就可以写出一个函数去表达。 def fibonacci(n): if n <= 1: return n return fibonacci(n-1) +fibonacci(n-2) 循环类型都需要避免死循环,在斐波那契额函数中,n<=1就是截止条件。如果原创 2022-04-07 16:37:16 · 681 阅读 · 0 评论 -
数据结构之字典树(一)
字典树(Trie) 定义 字典树按功能理解的话可以叫做单词查找树,或者键树,是一种树形结构,是哈希树的变种。典型应用在统计与排序大量的字符串,所以经常被搜索引擎系统用于文本词频的统计。 字典树将单词拆分成树的节点,沿着树的路径就形成了该单词,可以用50多个树节点(a-z,A-Z),以及20多层(英文字母最大长度)来表示单词。 字典树是一种以空间换时间的做法,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。输入一些字符串(前缀),以此节点为开头,该节点下的节点就是以输入的词为前缀所包含的所有词了原创 2022-04-11 18:04:00 · 61 阅读 · 0 评论 -
算法之动态规划(一)
动态规划(Dynamic programming) 动态规划是算法中经常用到的,通过将原问题分解成相对简单的子问题来求解复杂的问题的方法。动态规划与分治方法相似,通过组合子问题的解来求解原问题。与之不同的是,动态规划应用在子问题有重叠的情况下,即不同的子问题有共同的子子问题。解决重复子问题,并将子问题的结果保存在表格内,这就避免重复计算。 动态规划一般求解最优化问题,因为有很多可行性解,每个解都有一个值,我们需要寻找最优解的值,这个值称为这个问题的一个最优解,而不是最优解,因为可以有很多解都能达到最优值。原创 2022-04-14 14:36:55 · 59 阅读 · 0 评论 -
数据结构之树(一)
文章目录树(tree)与二叉树(binary tree)存储形式树存储结构为什么出现树的结构?代码表现二叉树(Binary Tree)二叉搜索树(Binary search tree)树的基本题目1. 树的遍历2. 判读是否是二叉搜索树思路:3. 二叉搜索树的最近公共祖先思路:4 . 二叉树最近公共祖先思路: 树(tree)与二叉树(binary tree) 树的概念可以对比单链表来,而且链表可以当作特殊的树。假如链表的next有两个以上的话,就会形成分叉,即树形结构。二叉树是指next指针只有两个以内。所原创 2022-04-07 14:37:36 · 2479 阅读 · 0 评论 -
数据结构之栈(一)
栈(stack)队列(Queue) 简单的栈跟队列也是一维结构,类似数组(array);所以分配固定的空间内存,需要考虑空间被占满。存储结构参考链表与数组(线性存储和链接存储) 栈是一个一端受限的线性表。类似竖着的柱子,只能从顶端即栈顶进栈或出栈,所以也能得出后进先出。 队列是能在两端进行操作的线性表。类似一个管道(pipeline),从一端进入另一端推出即先进先出。 存储形式 如下图 代码表现 栈(stack) 在python语言中通常用list来 stack = ["Amar", "A原创 2022-04-01 12:37:01 · 1130 阅读 · 0 评论 -
算法之动态规划(二)
动态规划: 一般步骤 定义状态,简单的一般是一维数组,复杂的是二维三维数组。 定义状态转移方程,这一步是处理子问题的通用解。 分析不能满足状态转移方程的特殊情况,类似剪枝的功能 得到最终解。 例题 1. 最小路径和 Leetcode 64 第64题:最小路径和 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例: 输入: [ [1,3,1], [1,5,1], [4,2,1原创 2022-04-18 13:43:43 · 73 阅读 · 0 评论 -
算法之贪心算法(一)
贪心算法(Greedy) 贪心法,在对问题求解的时候总是做出当前看来是最好的选择。由此它没有状态转移,所以大部分情况下看成是一维问题。整体使用次数不多,但是简单易于理解。 贪心算法场景 能够分成子问题来解决,并且子问题最优解能递推到全局最优解,这种子问题成为最优子结构。 贪心算法对子问题作出最优选择后,不能回退,一直往下递推。假如每次选择都进行记录,并且记录多种选择状态,根据以前的结果来进行多种选择状态下的最优解,就是动态规划。 贪心的实战 1. 买卖股票问题 leetcode122 给定一个数组 pric原创 2022-04-07 17:09:54 · 60 阅读 · 0 评论 -
算法之深度优先与广度优先(一)
广度优先搜索(BFS)跟深度优先搜索(DFS) 两种搜索方法都是对二或以上维数据进行遍历搜索,按照人的思维可以按照深度优先,还是广度优先的规律来避免重复扫荡某个点。将这种规律赋给计算机去执行就是广度优先搜索跟深度优先搜索。 广度优先会采用一维数据结构例如队列来将某一层的数据存储,循环队列内元素来查找下一层数据,即一层层往更深的层级搜索。 深度优先会定义一个截止条件例如:找到空,在没有遇到空的时候一直往下查找。查找到空之后就去回溯,直到找到另一条没有被访问的路径,然后依上往下查找。 广度优先搜索 从根节点出原创 2022-04-08 13:31:18 · 148 阅读 · 0 评论 -
算法之滑动窗口(一)
滑动窗口 系列 滑动窗口是大部分是根据题目移动而去求一些特殊数据。 题目 1. 滑动窗口最大值 leetcode 239 第239题:滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑原创 2022-04-21 17:43:20 · 105 阅读 · 0 评论