
数据结构与算法
文章平均质量分 85
逝水一战
重剑无锋,大巧不工
展开
-
拓扑排序及其应用
AOV网的概念:AOV网是有向无环图的一种,全称Activity OnVertex Network,顾名思义活动在顶点的网,使用顶点表示活动,顶点之间的边表示活动的先后顺序,例如<a,b>有一条从a到b的边,表示a活动发生在b之前。拓扑排序:在AOV网没有环路的情况下,将这些活动排成一个满足所有边的先后顺序条件线性序列。排序算法:1)选择AOV网中一个没有前驱的结点输出;2)将输出结点从图中删除(并删除与当前结点相连的所有边)3)重复1)2)直到图中没有结点。..原创 2020-06-01 17:00:33 · 1388 阅读 · 0 评论 -
子数组和的最大值最小问题
顾名思义,将一个数组分为k个子数组,求解怎么分才可以使得这些子数组中和最大的值最小。案例一:在D天内送达包裹的能力传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。传送带上的第 i个包裹的重量为weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。输入:weights = [1,2,3,4,5,6,7,8,9,10], D = 5输出:15解释:船舶..原创 2020-05-24 11:30:06 · 1484 阅读 · 0 评论 -
0/1背包与完全背包
背包问题描述:假设有一个固定容量的背包,然后有许多具有价值属性和重量属性的物品,要求在不超过背包最大容量的基础上装的物品的总价值最大。假设共有N个物品,背包的容量为M,物品 i 的价值与重量分别为 value[i] 和 weight[i]。dp[i][j] 为可选物品为一到i,背包空间为j时的最大价值。0/1背包0/1背包为最基础的背包问题,顾名思义,所有的物品只有一件,只有拿或不拿两种选择,dp[i][j]的表达式如下:最大价值为选i物品和不选i物品的最大值。实现代码如下:原创 2020-05-22 19:04:46 · 371 阅读 · 0 评论 -
子数组和问题
我们刷leetcod时总是遇到各种各样的子数组和的问题,这类问题一般都是可以通过构建一个前缀和数组,以O(N^2)的时间复杂度求解,但这并不是最优解。问题一:和为K的数组问题描述:给定一整型数组nums和一整数k,找到该数组中和为k的子数组的个数。input : nums = [1,2,3,-3,-2,-1,0] k = 0output: 5 分别为[3,-3], [2,3,-3,-2], [1,2,3,-3,-2,-1], [1,2,3,-3,-2,-1,0] , [0]...原创 2020-05-16 14:04:12 · 597 阅读 · 0 评论 -
K个排序链表的合并
问题描述;合并k个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4->4->5->6来源:力扣(LeetCode)链接:https://leetcode-cn.com/problem...原创 2020-05-01 10:28:59 · 547 阅读 · 1 评论 -
递增子序列问题
首先谈下,子串和子序列的区别,子串指必须是连续,子序列可以不连续,但是不能改变相对位置。本文所有的问题都是针对于子序列的。例如:str = "abcdefg""abc","cdr"为子串,“acd”为子序列,“cad”啥都不是,由于相对位置发生改变。问题一:递增子序列(leetcode491)给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。示...原创 2020-04-16 15:53:55 · 623 阅读 · 0 评论 -
n个骰子的点数
题目描述:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。示例 1:输入: 1输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]示例2:输入: 2输出: [0...原创 2020-03-12 13:28:58 · 254 阅读 · 0 评论 -
链表相交问题
问题描述:给定两链表的头结点,判断两链表是否存在公共部分(相交),若相交返回相交的第一个节点。经分析发现该问题可以分成如下两个子问题进行解决。子问题一:两无环链表是否相交算法一:假设list1长度为L1,list2长度为L2,假设公共部分长为m,由L1 + L2 - m = L2 + L1 -m可知第一路先遍历list1,再遍历list2,第二路先遍历list2再遍历list1,若...原创 2019-11-08 17:40:54 · 184 阅读 · 0 评论 -
有环链表判断
问题描述:判断链表是否有环,如若有环则返回其进入环的第一个节点。算法一:创建一个哈希表,遍历该链表过程中将判断该节点是否已存在于哈希表,如不存在则将其插入哈希表,存在则证明链表有环,并且该元素即为进入环的第一个节点;链表遍历过程中出现null则证明该链表无环。实现代码如下: public static Node<Integer> selution(Node...原创 2019-11-08 16:27:19 · 110 阅读 · 0 评论 -
回文链表的判断
问题描述:给定一单链表头结点,判断该链表是否具有回文结构. /* * 回文结构的判断 * Input 1 -> 2 -> 3 -> 2 -> 1 return true * Input 1 -> 2 -> 3 -> 4 -> 1 return false */算法一:借助一个堆栈(利用堆栈的先进后出特性),遍历...原创 2019-11-04 17:03:10 · 260 阅读 · 0 评论 -
按基准划分链表(分为三段)
问题描述:给定一个链表和一个特定值x,对链表进行分隔,使得所有小于x的节点放在前面,等于x的节点放在中间,大于x的结点放在后面。该问题为leetcode86分隔链表的加强版。实现思路:1.链表分隔首先定义三个小链表,遍历该链表,将小于x值的插到第一个链表后面,等于的插到第二个链表之后,大于的插入第三个链表后面。2.小表合并将这三个链表依次首位相连连成一个大链表...原创 2019-10-14 10:51:46 · 1255 阅读 · 0 评论 -
荷兰国旗问题
问题描述:给定一整型数组array和一整型值num,完成对array的排序,要求大于num的放后面,小于num的放前面,等于num的放中间,并且要求时间复杂度O(N),空间复杂度O(1)算法思路:定义两个指针记做pLeft,pRight。pleft表示左边最后一个元素的下标,pRight表示右边第一个元素的下标。遍历数组,array[p]时,需保证0 --pLeft 之间所有元素均小...原创 2019-10-13 19:56:06 · 114 阅读 · 1 评论 -
先序中序重构二叉树
已知二叉树的先序遍历序列和中序遍历序列,重构出二叉树。算法简介:如上图所示的二叉树,其先序遍历序列为:a b d c e f 中序序列为:d b a e c f首先可以知道根结点为先序的第一个元素即 a ,(a b d c e f)再由中序序列可知对于根结点a 其中序序列的左子树为db 右子树为ecf (d b a e c f)接下来可以得到先序序列 左子树为bd 右子...原创 2019-10-11 16:53:22 · 423 阅读 · 0 评论 -
队尾幸运编号
题目描述:N个人排成一队,从1到5轮流报数,报5的人是幸运者,出列。报到队尾后,从队首接着报,依次循环。输入N,输出队尾的人是第几名幸运者?例如:N=1,输出1N=2,输出2N=5,输出1N=8,输出3今天帮同学做这题,死活是想不出来,然而等笔试时间过了后,发现这nm这么明显的循环链表,当时楞是想不出来。大体思路:建立data从1->N,N长度的循环链...原创 2019-09-09 21:47:32 · 301 阅读 · 0 评论