首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

算法笔记(0002) - 【贪心算法】活动安排问题

活动安排问题 活动安排问题就是要在所给活动集合中选出最大相容活动子集合,是可以用贪心算法有效求解很好例子。该问题要求高效地安排一系列争用某一公共资源活动。...活动安排问题就是要在所给活动集合中选出最大相容活动子集合。 求解思路 将活动按照结束时间进行从小到大排序。...按照从小到大排序,挑选出结束时间尽量早活动,并且满足后一个活动起始时间晚于前一个活动结束时间,全部找出这些活动就是最大相容活动子集合。事实上系统一次检查活动i是否与当前已选择所有活动相容。...若相容活动i加入已选择活动集合中,否则,不选择活动i,而继续下一活动与集合A中活动相容性。若活动i与之相容,则i成为最近加入集合A活动,并取代活动j位置。...但对于活动安排问题,贪心算法greedySelector却总能求得整体最优解,即它最终所确定相容活动集合A规模最大。这个结论可以用数学归纳法证明。

1K20
您找到你想要的搜索结果了吗?
是的
没有找到

一种比线段树还高效区间算法

作者 | 小K 出品 | 公众号:小K算法 01 故事起源 有N个数排列成一排,给定一个区间,如何快速找出区间内最大数是多少呢?...再考虑一下,区间最值是有很强传递关系,这就引导我们可以把大问题化为小问题。 很显然,这就是一个标准线段树模型,不过今天我们再换一个更加高效算法,稀疏表。...因为之前已经求出了长度为1区间最大值,所以区间长度为2最大值可以通过区间长度为1结果直接推出来。 接下来就考虑长度为3区间了吗?...所以这个处理和线段思想也类似,需要进行区间分解。不过线段树可能分解成很多个区间,而稀疏表只需要分解成2个区间就可以了。...如果要动态维护变化,动态查询,那就得用在线算法,比如线段树。但稀疏表效率确实高,有状态压缩和动态规划思想,值得深入研究学习。 本文原创作者:小K,一个思维独特写手。

32520

【开源方案共享】无序点云快速线段分割算法

作者:Xiaohu Lu, Yahui Liu, Kai Li 编译:particle 本文提出了一种基于大规模无序点云三维线段检测算法。...与传统方法先提取三维边缘点后在拟合三维线段算法相比,本文提出了一种基于点云分割和二维线段检测基础上,能够快速实现三维线段检测算法。在输入无序点云情况下,对三维线段进行三步检测。...其次,对每个三维平面,将其所属所有点投影到平面上形成二维图像,然后进行二维轮廓提取和最小二乘拟合得到二维线段。然后将这些二维线段重新投影到三维平面上,以获得相应三维线段。...最后将这些二维线段重影映射到三维平面上,就可以获得三维线段点云数据。 (3)后处理:通过场景三维结构信息,去除三维平面和三维线段异常点云,最后合并所有三维线段点云数据。 论文步骤图集 ?...模块三后处理,噪声去除 去除噪声平面点云 去除噪声线段点云 所有线段点云合并 实验结果与总结 ? ? 本文提出并证明了一种简单有效大规模无组织点云三维直线检测算法

1.6K20

滑动窗口之【和最大值】&【最大集合

这是我参与11月更文挑战第3天,活动详情查看:2021最后一次更文挑战 图片 本篇带来两道经典关于滑动窗口算法题,有兴趣可在控制台跑一跑~ 求和最大值 题目来源:上一篇掘文《温故知新 ——...return maxVal }; const nums= [ 5, 7, 1, 4, 3, 6, 2, 9, 2 ] const k=5 maxSlidingWindow(nums,k) // 24 求最大集合...你只可以看到在滑动窗口内 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中最大值。...写一个函数来判断数组中最大数; 初始化窗口,求最大值保存; 滑动窗口,再求最大值保存; 滑动直至完毕; 本瓜题解: /** * @param {number[]} nums * @param {number...用 Math.max() 来每次从窗口找最大值,时间复杂度是 O(n * k),仍然很大; 窗口固定,求最大集合 在根本上是 单调队列 问题!

39720

子模最大FAST算法

作者:Adam Breuer,Eric Balkanski,Yaron Singer 摘要:在本文中,我们描述了一种称为快速自适应排序技术(FAST)算法,用于在基数约束下最大化单调子模块函数,其近似比任意接近...最近算法在渐近最坏情况分析方面具有可比较保证,但是它们实际轮数和查询复杂度在精度和置信度方面取决于非常大常数和多项式,使得它们对于大数据集是不实际。...我们主要贡献是在非渐近最坏情况查询复杂性和轮次数以及实际运行时方面都非常有效设计。...我们表明,该算法优于我们所知道任何子模块最大算法,包括通过在大型数据集上运行实验,对现有技术串行算法进行超优化并行版本。这些实验表明,FAST比现有技术快几个数量级。

1.1K20

最大公约数算法

算法原理:   对于辗转相除法:i和j最大公约数,也就是i和j都能够除断它。换句话讲,就是i比jn倍多那个数k(i = j*n + k,即i % j = k)应该也是最大公约数倍数。...所以就能转换成求k和j最大公约数。同理,对于更相减损术,同样道理,i比j大部分也是最大公约数倍数。...代码: 1 /** 2 * 求最大公约数算法汇总 3 * 4 */ 5 public class GCD { 6 public static void main(String[...k.然后将问题转换成求k和m最大公约数.依此类推,直到差为0. 48 * 这个方法也有一个问题,就是如果i和j想差比较大,那么这个方法存在较高时间复杂度. 49 */ 50...} 66 } 67 } 68 69 /** 70 * 第一种方法:辗转相除法, 即如果i>j, 那么先用i%j得到余数k.将问题转换成求k和m最大公约数

1.2K80

最大数maxnumber (HYSBZ 1012)(线段树区间查询和单点修改)(优雅暴力)

语法:Q L 功能:查询当前数列中末尾L 个数中最大数,并输出这个数值。限制:L不超过当前数列长度。2、 插入操作。...该行只有一个数,即序列中最后L个数最大数。...Output 5  100    A 96   Q 1   A 97   Q 1   Q 2                                        96  93  96 题解:简单线段树模板题...,建一颗空树逐个更新最大值就可以了,或者直接储存一个后缀里面最大数,每次更新,加上break,复杂度在不卡数据时候还可以。...,b[i]表示后i个数最大值 int main() { ll m,mod,n,x,y,i,j,k,f; // x是查询后保留值 char op; while(~scanf("

21110

贪心算法之 活动安排(Java代码实现)

活动安排问题 -- 资源争夺 问题描述 - 设有 n 个活动集合 A = {1, 2, ... , n}, 其中每个活动都要求使用同一资源,而在同一时间段内只有一个活动能使用资源 - 要求高效安排一系列争用公共资源活动...问题本质 - 在所给活动活动集合中选出最大相容活动子集 X 实例: 多个部门申请占用一个资源 部门 | 物理 | 数学 | 化学 | 外语 | 生物 | 音乐 | 计算机 | - | - | -...预处理: fi 非递减序列 贪心选择 - 最早完成活动优先加入相容集合 x使剩余活动可安排时间段极大化,相容活动集最大 si >= fj or sj >= fi 设计分析 若输入活动已就序...- 算法实现最大相容集时间: O(n) 若给出活动为就序 - 重排: O(nlogn), 求最大相容集: O(n) - T(n) = O(nlogn) + O(n) = O(nlogn)...算法3个数组和4个普通变量占用存储空间 - S(n) = O(3n) + O(4) = O(n) /** * 数组需按非递减序列 f[1] <= f[2] <= ... <= f[n]

1.1K97

活动安排问题--贪心算法

活动安排问题就是要在所给活动集合中选出最大相容活动子集合,是可以用贪心算法有效求解很好例子。该问题要求高效地安排一系列争用某一公共资源活动。...由于输入活动以其完成时间非减序排列,所以算法greedySelector每次总是选择具有最早完成时间相容活动加入集合A中。直观上,按这种方法选择相容活动为未安排活动留下尽可能多时间。...也就是说,该算法贪心选择意义是使剩余可安排时间段极大化,以便安排尽可能多相容活动。   此算法效率极高。...当输入活动已按结束时间非减序排列,算法只需O(n)时间安排n个活动,使最多活动能相容地使用公共资源。如果所给出活动未按非减序排列,可以用O(nlogn)时间重排。   ...贪心算法并不总能求得问题整体最优解。但对于活动安排问题,贪心算法却总能求得整体最优解,即它最终所确定相容活动集合A规模最大。这个结论可以用数学归纳法证明。

2.6K60

贪心算法-活动选择问题(Python实现)

# 有n个活动集合E={1,2,…,n},其中每个活动都要求使用同一资源, # 如演讲会场等,而在同一时间内只有一个活动能使用这一资源。...# 每个活动i都有一个要求使用该资源起始时间si和一个结束时间fi,且si <fi 。 # 如果选择了活动i,则它在半开时间区间[si, fi]内占用资源。...# 若区间[si, fi]与区间[sj, fj]不相交,则称活动i与活动j是相容。 # 也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。...# 活动安排问题就是要在所给活动集合中选出最大相容活动子集合, # 是可以用贪心算法有效求解很好例子。 # 该问题要求高效地安排一系列争用某一公共资源活动。...# 贪心算法提供了一个简单、漂亮方法使得尽可能多活动能兼容地使用公共资源。 import ioTool #编程任务:在所给活动集合中选出最大相容活动子集合

1K20

贪心算法(Java)

,所以算法greedySelector每次总是选择具有最早完成时间相容活动加入集合A中。...直观上,按这种方法选择相容活动为未安排活动留下尽可能多时间。也就是说,该算法贪心选择意义是使剩余可安排时间段极大化,以便安排尽可能多相容活动。 算法greedySelector效率极高。...阴影长条表示活动是已选入集合A活动,而空白长条表示活动是当前正在检查相容活动。...A = {1, 4, 8,11} 若被检查活动i开始时间Si小于最近选择活动j结束时间fi,则不选择活动i,否则选择活动i加入集合A中。 贪心算法并不总能求得问题整体最优解。...但对于活动安排问题,贪心算法greedySelector却总能求得整体最优解,即它最终所确定相容活动集合A规模最大。这个结论可以用数学归纳法证明。

49510

算法】二叉树最大深度

题目难度:简单[1] 题目描述: 给定一个二叉树,找出其最大深度。 二叉树深度为根节点到最远叶子节点最长路径上节点数。 说明: 叶子节点是指没有子节点节点。...测试用例: 示例: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它最大深度 3 解题分析及思路: 本题可以采用分治法...分:可以将左右两个节点拆分为同等子集 治:判断终止条件并计算 合:根据左右节点返回最大深度来计算当前节点子树最大深度 代码分析: 分操作:将左右两个节点拆分。...l := maxDepth(root.Left) r := maxDepth(root.Right) 治操作:当前访问到节点为空时,返回0值,代表此节点子树深度为0。...if root == nil { return 0 } 合操作:根据左右节点返回最大深度来计算当前节点子树最大深度,如果左子节点子树深度大于右子节点子树深度,返回左子节点子树深度 +

28820

考官如何用算法调度考生座位?

这种题目并不像动态规划这类算法拼智商,而是看你对常用数据结构理解和写代码水平,个人认为值得重视和学习。 另外说句题外话,很多读者都问,算法框架是如何总结出来,其实框架反而是慢慢从细节里抠出来。...我们使用TreeSet就是一个有序集合,目的就是为了保持线段长度有序性,快速查找最大线段,快速删除和插入。 二、简化问题 首先,如果有多个可选座位,需要选择索引最小座位对吧?...这个问题还用到一个常用编程技巧,就是使用一个「虚拟线段」让算法正确启动,这就和链表相关算法需要「虚拟头结点」一个道理。...比如下面这种情况会出错: 现在有序集合里有线段[0,4]和[4,9],那么最长线段longest就是后者,按照seat逻辑,就会分割[4,9],也就是返回座位 6。...return (y - x) / 2; } 这样,[0,4]和[4,9]distance值就相等了,算法会比较二者索引,取较小线段进行分割。

39020

C++经典算法题-产生可能集合

29.Algorithm Gossip: 产生可能集合 说明 给定一组数字或符号,产生所有可能集合(包括空集合), 例如给定1 2 3,则可能集合为: {}、{1}、{1,2}、{1,2,3}、{...解法 如果不考虑字典顺序,则有个简单方法可以产生所有的集合,思考二进位数字加法,并注意1出现位置,如果每个位置都对应一个数字,则由1所对应数字所产生就是一个集合,例如: ?...了解这个方法之后,剩下就是如何产生二进位数?...,如果有n个元素要产生可能集合,当依序产生集合时,如果最后一个元素是n,而倒数第二个元素是m的话,例如: {a b c d e n} 则下一个集合就是{a b c d e+1},再依序加入后续元素。...例如有四个元素,而当产生{1 2 3 4}集合时,则下一个集合就是{1 2 3+1},也就是{1 2 4},由于最后一个元素还是4,所以下一个集合就是{1 2+1},也就是{1 3},接下来再加入后续元素

57620

Python算法——树最大深度和最小深度

Python中最大深度和最小深度算法详解 树最大深度和最小深度是树结构中两个关键指标,它们分别表示树从根节点到最深叶子节点最大路径长度和最小路径长度。...在本文中,我们将深入讨论如何计算树最大深度和最小深度,并提供Python代码实现。我们将详细说明算法原理和步骤。 计算树最大深度 树最大深度是指从根节点到最深叶子节点最大路径长度。...我们可以通过递归遍历树左右子树来计算树最大深度。...) print("树最小深度:", min_depth_value) 输出结果: 树最大深度: 3 树最小深度: 2 这表示在给定二叉树中,最大深度为3,最小深度为2。...通过递归算法,我们能够有效地计算树最大深度和最小深度。这两个指标在分析树结构时常常被用于评估树形状和性质。通过理解算法原理和实现,您将能够更好地处理树结构问题。

19410

日拱算法,滑动窗口最大

这是我参与「掘金日新计划 · 8 月更文挑战」第30天,点击查看活动详情 ---- 日拱算法,接着冲~~ 题目: 给定一个数组 nums 和滑动窗口大小 k,请找出所有滑动窗口里最大值。...滑动窗口最大值 题解: 第一反应 有时候搞不太懂力扣对于难度等级判定,此题为“困难”?...用长度为 k 数组去遍历 nums 就可以了,每次拿到它最大值,然后push进结果数组中,再返回不就行了?...res.push(Math.max.apply(null, stack)) } return res }; 提交看看,结果报错“超出时间限制” QAQ 噢噢,再回看算法...while (last >= 0 && nums[i] > q[last]) { //2.循环求解序列中最大值 //2.求队列中最大值:如果新入队列元素

32830

☆打卡算法☆LeetCode 84、柱状图中最大矩形 算法解析

一、题目 1、算法题目 “给定n个非负整数,用来表示柱状图每个柱子高度,求柱状图中最大矩形面积。” 题目链接: 来源:力扣(LeetCode) 链接:84....求在该柱状图中,能够勾勒出来矩形最大面积。...首先,来思考一下如何去求最大矩形,找到某一根柱子,将其固定为矩形高度h,随后根据这根柱子向左右延伸,直到遇到高度小于h柱子,这样就确定了矩形左右边界,边界宽度为w,面积为h * w。...OK,首先说一下什么是单调栈,单调栈是一种很经典数据结构,里面存放数据都是有序,可以分为单调递增站和单调递减栈,常用于解决最大区间、最大视野、最大矩形等。...2、根据左右边界求出宽度,长乘宽就可以得到面积 3、根据单调栈,在出栈操作时候得到坐标边界,求出最大面积

24640

二叉树最大深度 & 645. 错误集合

二叉树最大深度 力扣题目链接[1] 给定一个二叉树,找出其最大深度。 二叉树深度为根节点到最远叶子节点最长路径上节点数。 「说明:」 叶子节点是指没有子节点节点。...示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它最大深度 3 。 思路: 本题可采用递归思路进行题解。...要求出二叉树最大深度,可以求出左右子树最大深度,找到较大者并且加一便是二叉树本身最大深度。递归终止条件是:如果当前节点为空,则返回0,没有节点说明深度为0。...需要注意终止递归条件。 645. 错误集合 力扣题目链接[2] 集合 s 包含从 1 到 n 整数。...不幸是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字值,导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了集合 S 发生错误后结果。

19420

最大连续子段和 dp算法

问题描述: 有n个数(以下都视为整数,浮点也一样),每个数有正有负,现在要在n个数中选取相邻一段,使其和最大,输出最大和。...问题分析: 对于这样问题,我们可以直接用暴力,一个双重循环,虽说可以,但也没有更高明方法?...我们再分析这个问题,如果我们知道了某个数前面一段数和,我们就该考虑把这个数加入到前一段,还是重新开始一段。这个地方很重要,如果前一段和小于0,我们重新建一段,反之加到前一段。...这样我们就可以把n个数分成几段了,且每一段都求出了他们和,然后再循环一次求出最大一个和,我们就得到想要结果了,也可以在分段时候直接求结果。

52320
领券