贪心算法

贪心习题小总结

匆匆过客 提交于 2019-12-06 08:02:24
不要怪笔者写的简陋,真的没有太多时间和精力来整理了。 要使用贪心算法就要证明,贪心策略可以得到全局最优解,因此它并没有动态规划应用那么广泛,但是一旦证明贪心策略的重要性往往可以用O(n)的复杂度解决问题。 一、分配问题 455. 分发饼干 贪心策略: 我们先对饼干和孩子排序,拿最小的饼干去满足胃口最小的孩子。 class Solution { public int findContentChildren(int[] g, int[] s) { int count = 0; Arrays.sort(g); Arrays.sort(s); int start = 0; for(int i = 0; i < g.length; i++) { for(int j = start; j < s.length; j++) { if(s[j] >= g[i]) { count++; start = j + 1; break; } } if(start >= s.length) break; } return count; } } 135. 分发糖果 策略: ①先给每一个孩子分发一个糖果存在数组a与b中 ②数组a从左向右遍历,只要右边的孩子比左边的孩子分数高就多发一枚糖果。 ③数组b从右向左遍历,只要左边孩子比右边孩子分数高就多发一枚糖果。 ④ans[i] = max{ a[i], b[i] }

算法笔记04 --- 贪心算法

你离开我真会死。 提交于 2019-12-06 06:13:41
概述 在对问题求解时,总是做出在当前看来是最好的选择。也就是说, 不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。   贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。 适用前提: 局部最优策略能导致产生全局最优解 解题思路   建立数学模型来描述问题。   把求解的问题分成若干个子问题。   对每一子问题求解,得到子问题的局部最优解。   把子问题的解局部最优解合成原来解问题的一个解。 应用场景    来源: https://www.cnblogs.com/clarino/p/11965090.html

贪心思想

旧街凉风 提交于 2019-12-05 22:08:12
贪心思想 保证每次操作都是局部最优的,并且最后得到的结果是全局最优的。 以下题为leetcode原题。 1. 分配饼干 455. Assign Cookies (Easy) 思路描述: 首先对孩子和饼干进行从小到大排序,那么依次比较, 如果饼干大于孩子的胃,则加1, 否则指向下一块饼干。 此方法也可称为双指针法。 代码实现: public static int findContentChildren(int[] g, int[] s) { Arrays.sort(g); Arrays.sort(s); int num = 0; int i = 0, j = 0; while (i < g.length && j < s.length) { //此处如果饼干大于孩子的胃,则num+1 同时, i j同时加1 if (s[j] >= g[i]) { ++num; i++; } //此处 if不成立时候,只需 指向饼干的指针指向下一块饼干 j++; } return num; } 2. 无重叠区间 435. Non-overlapping Intervals (Medium) 思路描述: 题目求的是找到需要移除区间的最小数量,使剩余区间互不重叠; 则求出最多有多少区间互不重叠,总的区间数-最多区间不重叠=移除的最小区间数量; 找出能存放的最大区间个数,则区间的末尾非常重要

贪心算法及经典例子

两盒软妹~` 提交于 2019-12-05 19:52:05
贪心算法 基本概念 所谓贪心算法是指,在对问题求解时,总是做出 在当前看来是最好的选择 。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的 局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。 所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。 贪心算法的基本思路 建立数学模型来描述问题。    2. 把求解的问题分成若干个子问题。    3. 对每一子问题求解,得到子问题的局部最优解。    4. 把子问题的解局部最优解合成原来解问题的一个解。 贪心算法的 实现框架 贪心算法适用的前提是:局部最优策略能导致产生全局最优解 实际上, 贪心算法适用的情况很少。 一般, 对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。 贪心算法的实现框架 从问题的某一初始解出发; while (能朝给定总目标前进一步) { 利用可行的决策,求出可行解的一个解元素; } 由所有解元素组合成问题的一个可行解; 贪心策略的选择 因为用贪心算法只能通过解局部最优解的策略来达到全局最优解,因此,一定要注意判断问题是否适合采用贪心算法策略,找到的解是否一定是问题的最优解。 例题分析

算法第四章作业

一个人想着一个人 提交于 2019-12-05 18:12:15
算法第四章作业 对贪心算法的理解 贪心算法:每次从局部贪心,找到局部最优,最后再找到全局最优,但是不一定是题目的最优解。 一般框架: 1)输入集合;2)初始空解集;3)在选集中做贪心选择,判断是否满足约束条件。 基本要素:贪心选择性质与最优子结构性质 基本步骤: 1) 从问题某初始结开始; 2) 循环中,根据局部策略,得到一个部分解,做小问题规模。 3) 综合所有解,的到最终解。   2.汽车加油问题的贪心选择性质 每次出发时 比较车的剩余油量与去下一站的耗油量的大小 , 剩余油量大则去下一站并减去去下一站的耗油量,如果剩余油量小 剩余量重置为满油 。 来源: https://www.cnblogs.com/Epher/p/11939234.html

Algorithm lesson final exam

纵饮孤独 提交于 2019-12-05 18:10:25
1、algorithm analysis O B/W/AV/AMOR,混入其他问题,设计+分析 2、传统算法(肯定要考) 1)divide and conquer master therem、 recursive tree、分析复杂度、递归树加起来得到最终结果 2)greedy algorithm example sort->select 拟阵 独立系统的贪心模板,直接得到近似比 3)dynamic programming sub-optimal structrue、编辑距离 3、graph algorithm 1)exproration bfs and dfs、最小生成树 2)最短路,single path all pair 负环、负边 3)max-flow 优化方式 4、turing machine Np/NPC NP-hard np-reduction 5、approximation greedy/sequential/local search/lp rouding 三种算法的设计、图算法、图灵机、近似算法 来源: https://www.cnblogs.com/elpsycongroo/p/11939165.html

算法第四章作业

泄露秘密 提交于 2019-12-05 16:55:11
一、对贪心算法的理解 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 做贪心题,首先要猜想贪心策略,然后尝试证明策略的正确性。 二、汽车加油问题 有足够的汽油支持汽车开到下一个加油站,就不加油,反之加油,这样的贪心策略保证了加油次数尽可能少,让每次加油后汽车能跑得更远。 三、遇到的问题及结对编程情况 做题的时候想不到合适的算法就很尴尬,会卡住。 陷入思维旋涡的时候就要靠队友了,结伴编程的好处就体现了出来,最后也成功过题了。 来源: https://www.cnblogs.com/Remilia-Scarlet/p/11934706.html

第四章作业

谁说我不能喝 提交于 2019-12-05 15:43:30
一.我对贪心算法的理解: 贪心算法概念:贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。 所以由概念,可以说贪心算法不是从整体最优解上加以考虑,他所做的是在一些意义上的最优解,同时也不能保证对所有问题的整体都能取得最优解。 能不能取得最优解取决于他的贪心策略,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 贪心算法有两个基本要素 (1)贪心选择:贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。 (2)最优子结构:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。 二.汽车加油问题的贪心选择性质: 贪心选择:最远且能到达的加油站,这样一直选择则可到达目的地。 三.结对编程的情况 我和梁家铭同学配合默契,合作愉快,在解决问题的时候共同思考 同时我们还会更加努力学习,一起解决对我们来说尚为困难的问题。 来源: https://www.cnblogs.com/DreamGCdog/p/11932364.html

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

☆樱花仙子☆ 提交于 2019-12-05 14:33:42
问题描述:现有一批活动,有开始时间和结束时间,如何合理的安排使得尽可能多的活动得以开展; 活动 讲座 会议 演出 电影 辩论赛 考试 开始时间 1 3 0 5 3 7 结束时间 3 4 4 7 6 8 解题思路:如何才能保证安排更多的活动呢?肯定是越早结束越好。所以首先对结束时间按升序排序,再依此选取符合的。比如说,肯定是先选讲座,然后可以选会议和演出,但是演出的开始时间是0,不符合,所以选会议,辩论赛开始时间是3,不符合所以选电影,最后选考试。 首先是活动的定义: name=["讲座","会议","演出","电影","辩论赛","考试"] start=[1,3,0,5,3,7] end=[3,4,4,7,6,8] 然后,我们要对活动结束时间进行排序,同时,这种排序要影响到name和开始时间start。我们可以用元祖来进行配对,然后对元祖排序,相应的name和start也就改变了。 name_end =list(zip(name,end)) activity=sorted(activity,key=lambda x:x[1]) name_end =sorted(name_end,key=lambda x:x[1]) print(activity) print(name_end) 然后再重新取出start,end start = [i[0] for i in activity]

第四章总结

南笙酒味 提交于 2019-12-05 12:37:37
贪心算法 : 就是在整个问题中,可以通过不断地求解相同子问题的最优解,最后达到问题的最优解。 一般的套路就是:通过不断求最大(小)值来达到目的,或者最晚,最早,用时最短 ……. 等等。 汽车加油问题的贪心选择性质: 每次都假设车开到用完所有的油再加,就是最优解。可能出现在半路没油的情况,那么就让其在距离其最近的一个加油站加满油,没到一个加油站预判断一下。, 本章中学习的问题: 1 》有些问题是,不是一般的选择最大,最小的问题。就好比说“删数问题”,它的解法不是每次删去最大值,而是删去一个局部的递增最大问题,所以刚开始写的时候先入为主了,以为贪心就是找最大最小的问题。 2 》有时候想用动态规划来解决贪心问题,但是总想不出怎么办。 3 》在硬币问题中,什么时候用贪心,什么时候用 DP ,没有一个想出一个通解,如果每次找特例的话,就不是很严谨。 结对编程的问题: Emm ,第一第三都挺简单的,就是第二题难想,想了好久,,自己先入为主的以为删去最大值,实际上不是,以至于之后思路僵化。自己还是要多打题,哎。 来源: https://www.cnblogs.com/aresjohnson/p/11925397.html