算法与数据结构
文章平均质量分 78
11 + 17 = 28
这个作者很懒,什么都没留下…
展开
-
红黑树的删除(二):自顶向下
自顶向下的删除原创 2020-07-25 13:57:38 · 263 阅读 · 0 评论 -
红黑树的删除(一):自底向上
RBTree 红黑树的添加操作较为简单,网上有许多详细代码与解释,本文不再赘述。本文将详细介绍红黑树的删除操作。定义概念3-节点:由一个红节点连接一个黑节点组成。例:(2-7),(7.2-7.3)。为便于描述,将位于3-节点中的节点直接称为3-节点。例:节点2是3-节点。对于不是叶节点的3-节点,有左、中、右三个子节点。例:节点1,节点3,节点(7.2-7.3) 分别为节点(2-7)的左子节点、中子节点、右子节点。2-节点:由一个左子节点不为红节点的黑节点组成。例:节点1,节点9叶节点:没原创 2020-06-22 16:52:57 · 201 阅读 · 0 评论 -
接雨水:双指针法
以列表的形式给定nnn个非负整数表示每个宽度为111的柱子的高度图,列表的索引表示对应柱子左边界所处坐标。计算按此排列的柱子,下雨之后能接多少雨水。如:[0,1,0,2,1,0,1,3,2,1,2,1][0,1,0,2,1,0,1,3,2,1,2,1][0,1,0,2,1,0,1,3,2,1,2,1]可以接666个单位的雨水。 容易想到双指针法,关键在于确定跟新指针的法则。 水最多可以...原创 2020-04-04 14:36:55 · 190 阅读 · 0 评论 -
圆圈中最后剩下的数字
0,1,,n−10,1,,n-10,1,,n−1共nnn个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。 题目并不难,若用数组lll表示圆圈,关键在于当前索引加上步数(index+m−1index+m-1index+m−1)若超出数组范围应该如何处理。 不难发现,从任意索引移动m−1m-1m−1步时会回到原索引位置,因此当index+...原创 2020-03-30 23:30:00 · 141 阅读 · 0 评论 -
动态规划专题(二):解决0-1背包问题并找到所有最优方案
小明有一个容量为w的背包,现在有n件物品,给定这些物品的价值与重量,求小明应如何选择物品使背包中的物品价值最大。 本文解法并不能严格称为动态规划,只是使用了动态规划的思想对递归进行了优化。将每次递归所得结果记录下来,下次达到相同的状态时直接查询即可,不需再次计算。实际上,这种思想可以相对显著的优化递归的性能。获取最大值 我在做这个题目的时候走了一些弯路,这里我把我的错误代码也放出来,...原创 2020-03-11 15:26:01 · 835 阅读 · 0 评论 -
动态规划专题(一):求最大子矩阵和并找到所有最优子矩阵
最大子序列和 在开始求解最大子矩阵和之前,先来看最大子序列和。 使用动态规划求解最大子序列和并不难,其最关键的状态转移方程比较容易理解:result[index]={result[index−1]+array[index]result[index−1]>0array[index]result[index−1]≤0result[index] = \begin{cases} res...原创 2020-03-07 02:23:46 · 1003 阅读 · 0 评论 -
Trie
Trie,又叫前缀树,字典树等,通常用于保存字符串。为了正确区分拥有相同前缀的字符串,将每一个字符串的最后一个字符进行标记,记为键。在Trie中,每个节点只有一个字符,但可以被多个键使用。使用trie存储信息即保证了效率,由于所有相同前缀的单词都可以得到重复使用,因此也大大节省了内存。如:‘tea’,‘teach’,'teacher’三个单词只需要用7个节点存储。由于Trie的优良性能,在实际...原创 2020-03-04 13:55:21 · 186 阅读 · 0 评论 -
堆结构
首先介绍树的完整性定义。一棵树满足以下条件时,则称树是完整的:* 所有的非叶节点都是满的。* 若底层没有满,则底层的所有节点尽可能靠左。 以二叉最小堆为例讲解以下内容。一棵二叉树满足以下条件时称为二叉最小堆:* 树是完整的。* 所有的子节点不小于父节点。 对于最小堆结构,remove_smallest与add是两个最常见的操作。remove_smallest 拿掉堆最顶部...原创 2020-02-29 23:26:15 · 83 阅读 · 0 评论 -
树结构(二)
树的遍历深度优先遍历 深度优先遍历分为前序遍历,中序遍历,后序遍历。顾名思义,三者的不同在于输出顺序不同。二叉树的遍历代码如下:def preorder(tree, height=0): if tree is None: return print(tree.get_label()) preorder(tree.get_left(), height +...原创 2020-02-29 16:22:27 · 133 阅读 · 0 评论 -
哈希表
哈希表原理 哈希表初始使用MMM个buckets存储数据,将数据对应的哈希值除以MMM取余,根据余数存入对应的buckets中。当所有buckets中存储的数据总数NNN超过一定限度时(如:NM≥1.5\frac{N}{M}\geq 1.5MN≥1.5),将哈希表的buckets数量翻倍(M=2MM=2MM=2M),并将之前存储的数据按相同的方法重新分配。用链表存储的哈希表代码如下:cla...原创 2020-02-29 14:28:18 · 117 阅读 · 0 评论 -
树结构(一)
二叉搜索树 二叉搜索树是树结构中最基础的一种。class BST(object): def __init__(self, key, left=None, right=None): self.__label = key self.__right = right self.__left = left self.__heigh...原创 2020-02-28 22:37:25 · 171 阅读 · 1 评论 -
盛水最多的容器:双指针法
给定nnn个非负整数[a1,a2,...,an][a_1,a_2,...,a_n][a1,a2,...,an],每个整数代表坐标中的一个点(i,ai)(i,a_i)(i,ai)。在坐标系内画nnn条垂线,点(i,ai)(i,a_i)(i,ai)与点(i,0)(i,0)(i,0)分别代表垂直线iii的两个端点。找出两条线使它们与x轴共同构成的容器可以容纳最多的水。 当索引的差值相同...原创 2020-02-28 19:05:14 · 101 阅读 · 0 评论 -
QuickUnion
QuickUnion QuickUnion的原理较简单,每次连接两元素时找到两元素对应根节点,连接根节点即可。class QuickUnion(object): def __init__(self, n): self.__parent = list(range(n)) def get_root(self, p): p_parent = sel...原创 2020-02-28 19:00:51 · 175 阅读 · 0 评论 -
回文数:反转一半
判断一个整数是否是回文数,满足:不允许把整数转换为字符;对于特别大的整数,运算时不可超出环境中整数允许的最大值。def is_palinedrome(integer): if integer < 0 or (integer % 10 == 0 and integer != 0): return False temp = 0 while temp ...原创 2020-02-28 14:55:36 · 160 阅读 · 0 评论 -
加法实现原理
给出两个非空链表用来表示两个非负整数。其中,它们各自的位数按照逆序方式存储,并且每个节点只能存储一位数字。如’1 -> 2 -> 3’表示’321’。以链表形式返回两数之和。# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val =...原创 2020-02-28 12:28:01 · 233 阅读 · 0 评论 -
无重复字符的最长子串
给定一个字符串,找出其中不含有重复字符的最长子串的长度。 生成一个队列,将队列中的字符存于字典中。若下一个字符在字典中已经存在,则从队列中与字典中同时依次删除队尾字符,直至下一个字符不存在于字典中,将该字符添于队首,进行下一次循环。def get_longest(s): strings, current_string = {}, '' max_length, curren...原创 2020-02-28 11:59:38 · 85 阅读 · 0 评论 -
排序算法
快速排序 快速排序在大多情况下的表现优异,其核心思想为分而治之。 具体操作:对于一个长度为nnn的数组AAA,根据改变元素x=A[i]x=A[i]x=A[i]的位置,使得数组AAA满足:* xxx左边的元素都不大于xxx。* xxx右边的元素都不小于xxx。 此时xxx就位于数组排序完成后其应所在位置。然后对xxx左右两侧进行递归操作即可完成排序。值得注意的是,通常将xxx选定为数...原创 2020-02-28 11:56:20 · 69 阅读 · 0 评论 -
最长回文子串
给定一个字符串sss,找到sss中最长的回文子串。例:‘bababd’的最长的回文子串为’babab’。记字符串sss长度为nnn。暴力算法def is_palinedrome(string): for s in range(len(string) // 2): if string[s] != string[len(string) - s - 1]: ...原创 2020-02-28 11:52:51 · 107 阅读 · 0 评论 -
寻找有序数组中位数:二分查找
给定两个长度分别为mmm与nnn的有序数组AAA与BBB。找出这两个有序数组的中位数,并且要求算法的时间复杂度为Θ(log(m+n))\Theta(\log (m + n))Θ(log(m+n))。假设AAA与BBB不会同时为空。 解题思路: 将两个原数组分为两个新数组A与B,若A与B满足以下条件,则根据 m+nm+nm+n 的奇偶性易求得中位数。length(C)=length(...原创 2020-02-28 11:48:23 · 216 阅读 · 0 评论 -
拓扑排序
若图为有向无环图,则可进行拓扑排序。拓扑排序的结果为DFS后序遍历的倒序。选课是拓扑排序的经典应用场景之一,即:选修一门课程之前须先修完该课程的前置课程。class Graph(object): def __init__(self, points_nums, is_directed): self.__points_nums = points_nums ...原创 2020-02-28 11:45:53 · 165 阅读 · 0 评论 -
深度优先搜索
无论是深度优先搜索还是广度优先搜索,搜索的关键在于建立两个数组,一个数组记录节点路径——输出结果;另一个数组记录已走过的节点——不走回头路。class Graph(object): def __init__(self, points_nums, is_directed): self.__points_nums = points_nums self.__...原创 2020-02-28 11:34:30 · 194 阅读 · 0 评论 -
图的存储方式
对于一个有VVV个点,EEE条边的图:存储方法add_edge(v,w)get_adj(v)遍历has_edge(v,w)空间复杂度邻接矩阵Θ(1)\Theta(1)Θ(1)Θ(V)\Theta(V)Θ(V)Θ(V2)\Theta(V^2)Θ(V2)Θ(1)\Theta(1)Θ(1)Θ(V2)\Theta(V^2)Θ(V2)边的集合Θ(1)\Th...原创 2020-02-28 11:20:56 · 151 阅读 · 0 评论 -
最省力的路径
给定一张mmm行nnn列的地图由0和1表示,0表示可以走,1表示不能走。起点坐标与终点坐标分别为(x1,y1)(x_1,y_1)(x1,y1)与(x2,y2)(x_2,y_2)(x2,y2)。以地图左上角为原点,坐标为(0,0)(0,0)(0,0)。求从起点到终点最少需要转几次弯及所对应的路径。class Point(object): def __init__(self, x...原创 2020-02-28 02:13:21 · 116 阅读 · 0 评论 -
平分酒水
在一个容量为v1v_1v1的瓶中装满一瓶酒,还有两个容量分别为v2v_2v2与v3v_3v3的空瓶,问将容量为v1v_1v1的瓶中的酒平分最少需要几次,以及如何倒水。当v1v_1v1为奇数时,平分向下取整。(b1>b2>b12>b3b_1>b_2>\frac{b_1}{2}>b_3b1>b2>2b1>b3)class ...原创 2020-02-28 01:49:30 · 205 阅读 · 0 评论 -
Dijkstra最短路径算法
Dijkstra最短路径算法本质上也是广度优先搜索。 考虑到算法的remove_smallest操作,使用最小堆提升效率。class Point(object): def __init__(self, index, value): self.index = index self.value = value def __lt__(self,...原创 2020-02-28 01:22:59 · 119 阅读 · 0 评论 -
链表翻转
翻转指定区间内的链表连接方向(不改变节点的值),以’1->2->3’的形式输出翻转后的链表。class IntNode(object): def __init__(self, value, next_node, previous_node): self.value = value self.next = next_node ...原创 2020-02-28 01:10:47 · 109 阅读 · 0 评论