数据结构与算法
蕾欧娜等等
这个作者很懒,什么都没留下…
展开
-
刷题记录 | 组合 + 二叉树遍历 + 动态规划
文章目录组合二叉树的层次遍历最小路径和最低票价等差数列划分零钱兑换组合给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。示例:输入: n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4],]思路:回溯,但是要剪枝。Python 代码:def combination(n, k): def dfs(candicates, cur): if len(cur) == k:原创 2020-09-08 15:08:52 · 201 阅读 · 0 评论 -
刷题记录 | 动态规划算法题 - 子序列和子串相关
最长公共子序列给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。注意区分:子序列和子串的区别。子序列的话只要元素都存在,并且原创 2020-09-07 20:37:55 · 177 阅读 · 0 评论 -
刷题记录 | 拼写单词 + 单词拆分 + 前k个高频单词
拼写单词给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。返回词汇表 words 中你掌握的所有单词的 长度之和。示例:输入:words = ["cat","bt","hat","tree"], chars = "atach"输出:6解释: 可以形原创 2020-09-07 16:30:10 · 223 阅读 · 0 评论 -
刷题记录 | 岛屿问题 + 幂集运算
岛屿数量题目描述:给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。Python 代码如下:class Solution: # 方向数组,表示了相对于当前位置的4个方向的横纵坐标的偏移量 directions = [(-1,0),(0,-1),(1,0),(0,1)] def numIslands(self, grid原创 2020-09-06 09:53:50 · 144 阅读 · 0 评论 -
刷题记录 | 回溯算法题
电话号码的组合题目:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。示例:输入:"23"输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].解题思路:回溯法。即先选择一条路走到黑,走不动了退回来一步,再探索其他的方向,该位置的方向探索完之后,再退出来一步,继续探索。回归到这道题就是:假设该字符串为 ‘23’,选择第一个数字 2,接下来需要遍历 2 代表的字母 ‘a’, ‘b’, ‘c’。首先选择字母 ‘a’,然原创 2020-09-05 21:26:35 · 200 阅读 · 0 评论 -
单向循环链表基本操作的 Python 实现
单向循环链表的基本操作的实现在之前的博客中介绍了三种链表,分别是单链表、单向循环链表以及双向链表。本篇博客将用Python来实现单向循环链表的如下操作。(用到的工具是Python 3)单向循环链表的示意图is_empty() : 判断链表是否为空length() : 返回链表的长度travel() : 遍历add(item) : 在头部添加一个节点append(item) : 在尾部添加一个节点insert(pos, item) : 在指定位置 pos 添加一个节点remove(item原创 2020-06-07 11:25:15 · 270 阅读 · 0 评论 -
单向链表基本操作的 Python 实现
单向链表的基本操作的实现在之前的博客中介绍了三种链表,分别是单链表、单向循环链表以及双向链表。本篇博客将用Python来实现单链表的如下操作。(用到的工具是Python 3)is_empty() : 判断链表是否为空length() : 返回链表的长度travel() : 遍历add(item) : 在头部添加一个节点append(item) : 在尾部添加一个节点insert(pos, item) : 在指定位置 pos 添加一个节点remove(item) : 删除一个节点searc原创 2020-06-07 11:18:08 · 244 阅读 · 0 评论 -
双向链表基本操作的 Python 实现
双向链表的基本操作的实现在之前的博客中介绍了三种链表,分别是单链表、单向循环链表以及双向链表。本篇博客将用Python来实现双向链表的如下操作。(用到的工具是Python 3)is_empty() : 判断链表是否为空length() : 返回链表的长度travel() : 遍历add(item) : 在头部添加一个节点append(item) : 在尾部添加一个节点insert(pos, item) : 在指定位置 pos 添加一个节点remove(item) : 删除一个节点sear原创 2020-06-07 11:03:01 · 444 阅读 · 0 评论 -
顺序表之链表的介绍
目录链表链表的定义单向链表单向循环链表双向链表上一篇博客介绍了线性表的其中一个表 - 顺序表,本篇博客来介绍第二种表,即链表。链表我们先来看看有了顺序表,为什么还要链表?顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活。链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。链表的定义链表(Linked List)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续村存储数据,而是在每一个节点(数据存储单元)里存放原创 2020-06-07 11:01:15 · 154 阅读 · 0 评论 -
线性表之顺序表的介绍
线性表在程序里,经常需要将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数。一组数据中包含的元素个数可能发生变化(可以增加或删除元素)。对于这种需求,最简单的解决方案便是将这样一组元素看成一个序列,用元素在序列里的位置和顺序,表示实际应用中的某些有意义的信息,或者表示数据之间的某种关系。这样的一组序列元素的组织形式,我们可以将其抽象为线性表。一个线性表是某类元素的一个集合,还记录着元素之间的一种顺序关系。线性表是最基本的数据结构之一,在实际程序中原创 2020-06-07 09:48:13 · 245 阅读 · 0 评论 -
栈和队列 + Python实战
栈和队列是数据结构中非常常用的数据结构,本篇博客对栈和队列的概念进行简单介绍,并用 Python 代码实现这两种数据结构。栈栈(stack),有时候也被称为堆栈,是一种容器,可以存入数据元素、访问元素、删除元素,它的特点在于只能允许容器的一端(称为栈顶端指标,英文:top)进行加入数据(英文:push)和输出数据(英文:pop)的运算。没有了位置概念,保证任何时候可以访问、删除的元素都是此前最后存入的那个元素,确定了一种默认的访问顺序。由于栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO,L原创 2020-06-06 22:41:02 · 93 阅读 · 0 评论 -
二分查找法 + Python实现
搜索搜索是在一个 item 集合中找到一个特定 item 的算法过程。搜索通常返回的答案是 True 或 False,即该 item 是否存在。搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找。本篇博客主要介绍二分法查找。二分法查找二分查找又称为折半查找,优点是比较次数少,查找速度快,平均性能好;缺点是要求待查找的表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排序,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则原创 2020-06-06 21:01:42 · 207 阅读 · 0 评论 -
二叉树的遍历 - DFS、BFS + Python实现
这篇博客介绍二叉树的遍历,包括深度优先遍历和广度优先遍历。二叉树的遍历树的遍历是树的一种重要的运算。所谓遍历是指对树中所有节点的信息的访问。即依次对树中每个结点访问一次且仅访问一次。我们把这种对所有节点的访问称为遍历(traveral)。那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历,深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法也能用堆栈来实现。深度优先遍历(DFS)对于一棵二叉树,深度优先搜索(Depth First Search)是沿着树的深度遍历树的节点,尽可能原创 2020-06-06 20:43:57 · 1590 阅读 · 0 评论 -
二叉树的概念、性质、创建 + Python实现
这篇博客介绍二叉树,包括二叉树的基本概念、二叉树的性质以及Python的实现。我们先来看看什么是二叉树?二叉树的基本概念二叉树是每个节点最多有两个子树的结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)如图所示是一个二叉树。二叉树的性质性质1:在二叉树的第iii层上至多有2i−12^{i-1}2i−1个节点(i>0)(i>0)(i>0)性质2:深度为kkk的二叉树至多有2k−12^k-12k−1个节点(k>0)(k&g转载 2020-06-06 20:21:09 · 234 阅读 · 0 评论 -
树的概念、术语、种类及应用
本篇博客介绍树,包括树的概念、术语、种类以及应用,从而对树有一些直观的认识和理解。首先我们来看一下树的概念。树的概念树(英文:Tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由 nnn (n>=1)( n >=1 )(n>=1) 个有限节点组成的一个具有层次关系的集合。之所以称为“树”是因为它看起来像一棵倒挂的树,也就是它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父原创 2020-06-06 17:44:25 · 357 阅读 · 0 评论 -
排序算法 | 归并排序 + Python实现
排序算法在数据结构与算法中,常用的排序算法有如下6种:冒泡排序、选择排序、插入排序、快速排序、希尔排序以及归并排序。下面介绍第6种算法:归并排序。归并排序归并排序是采用分治法的一个非常典型的应用。归并排序的思想是先递归分解数组,再合并数组。将数组分解为最小之后,然后合并两个有序的数组。基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移动一位。然后再比较,直到一个数组为空,最后把另外一个数组的剩余部分复制过来即可。算法分析Python 实现def merge_sort(原创 2020-06-05 22:04:34 · 217 阅读 · 0 评论 -
排序算法 | 希尔排序 + Python实现
排序算法在数据结构与算法中,常用的排序算法有如下6种:冒泡排序、选择排序、插入排序、快速排序、希尔排序以及归并排序。下面介绍第5种算法:希尔排序。希尔排序希尔排序(Shell Sort)是插入排序的一种,也称为缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 DL.Shell 于1995年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减少至1时,整个文件恰被分为一组,算法便原创 2020-06-05 21:51:59 · 128 阅读 · 0 评论 -
排序算法 | 快速排序 + Python 实现
排序算法在数据结构中,常用的排序算法有如下6种:冒泡排序、选择排序、插入排序、快速排序、希尔排序以及归并排序。下面介绍第4种算法:快速排序。快速排序快速排序 (Quick Sort),又称为划分交换排序 (partition-exchange sort),通过一次排序把要排序的数据分割为独立的两个部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。算法步骤从数列中挑出一个元素,称为“基准”(原创 2020-06-05 21:31:19 · 118 阅读 · 0 评论 -
排序算法 | 插入排序 + Python实现
排序算法在数据结构中,常用的排序算法有如下6种:冒泡排序、选择排序、插入排序、快速排序、希尔排序以及归并排序。下面介绍第3种算法:插入排序。插入排序插入排序(Insertion Sort)是一种简单直观的排序算法。工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。算法分析Python 实现def insert_sort(alist): # 从第二个位置原创 2020-06-05 21:10:18 · 141 阅读 · 0 评论 -
排序算法 | 选择排序 + Python实现
排序算法在数据结构中,常用的排序算法有如下6种:冒泡排序、选择排序、插入排序、快速排序、希尔排序以及归并排序。下面介绍第2种算法:选择排序。选择排序选择排序(Selection Sort)是一种简单直观的排序算法。工作原理如下:在未排序序列中找到最大(小)元素,存放在排序序列的起始位置。再从剩余未排序的元素中继续寻找最大(小)元素,然后放到已排序序列的末尾。以此类推,直到所有的元素均排序完毕。选择排序的主要优点与数据移动有关,如果某个元素位于正确的位置上,则它不会被移动。选择排序每次交换一原创 2020-06-05 20:58:46 · 148 阅读 · 0 评论 -
排序算法 | 冒泡排序 + Python实现
排序算法在数据结构中,常用的排序算法有如下6种:冒泡排序、选择排序、插入排序、快速排序、希尔排序以及归并排序。下面介绍第一种算法:冒泡排序。冒泡排序冒泡排序(Bubble Sort)是一种简单的排序算法。名字由来是因为越小的元素会经由交换慢慢“浮”到列数的顶端。基本思想是:重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,重复进行遍历工作直到没有再需要交换,也就是该数列已经排序完毕。算法运作比较相邻的元素。如果第一个比第二个大(升序),则交换两个元素。对每一对相邻原创 2020-06-05 20:40:34 · 156 阅读 · 0 评论