贪心算法实例

我们熟知的选择排序,其采用的就是贪心策略。它所采用的贪心策略即为每次从未排序的数据中选取最小值,并把最小值放在未排序数据的起始位置,直到未排序的数据为0,则结束排序。

voidswap(int*arr,inti,intj){inttmp=arr[i];arr[i]=arr[j];arr[j]=tmp;}voidselectSort(int*arr,intn){//降序for(inti=0;i=arr[maxIndex])maxIndex=j;}swap(arr,i,maxIndex);}}平衡字符串问题描述:

在一个平衡字符串中,‘L’和‘R’字符的数量是相同的。给你一个平衡字符串s,请你将它分割成尽可能多的平衡字符串。注意:分割得到的每个字符串都必须是平衡字符串,且分割得到的平衡字符串是原平衡字符串的连续子串。返回可以通过分割得到的平衡字符串的最大数量。

贪心策略:从左往右扫描,只要达到平衡,就立即分割,不要有嵌套的平衡。故可以定义一个变量balance,在遇到不同的字符时,向不同的方向变化,当balance为0时达到平衡,分割数更新。比如:从左往右扫描字符串s,遇到L,balance-1,遇到R,balance+1.当balance为0时,更新cnt++如果最终cnt==0,说明s只需要保持原样,返回1

代码实现:

classSolution{public:intbalancedStringSplit(strings){if(s.size()==1)return0;intcnt=0;intbalance=0;for(inti=0;i买股票的最佳时机问题描述:

给定一个数组prices,其中prices[i]是一支给定股票第i天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

classSolution{public:intmaxProfit(vector&prices){intprofit=0;for(inti=0;i跳跃游戏问题描述:

给定一个非负整数数组nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。

贪心策略:根据题目描述,对于数组中的任意一个位置y,只要存在一个位置x,它本身可以到达,并且它跳跃的最大长度为x+nums[x],这个值大于等于y,即x+nums[x]>=y,那么位置y也可以到达。即对于每一个可以到达的位置x,它使得x+1,x+2,…,x+nums[x]>=y,那么位置y也可以到达。一次遍历数组中的每一个位置,并实时更新最远可以到达的位置。对于当前遍历到的位置x,如果它在最远可以到达的位置范围内,那么我们就可以从起点通过若干次跳跃达到该位置,因此我们可以用x+nums[x]更新最远可以到达的位置。在遍历的过程中,如果最远可以到达的位置大于等于数组中的最后一个位置,那就说明最后一个位置可到达,直接返回true。遍历结束后,最后一个位置仍不可达,返回false。例如:[2,3,1,1,4]一开始在位置0,可跳跃的最大长度为2,因此最远可以到达的位置倍更新为2;继续遍历到位置1,由于1<=2,因此位置1可达。用1加上它最大可跳跃的长度3,将最远可以到达的位置更新为4,4大于最后一个位置4,返回true代码实现:classSolution{public:boolcanJump(vector&nums){intmaxLen=nums[0];for(inti=0;i=nums.size()-1)returntrue;}}returnfalse;}};钱币找零问题描述:

假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0,c1,c2,c3,c4,c5,c6张。现在要用这些钱来支付K元,至少要用多少张纸币?

贪心策略:显然,每一步尽可能用面值大的纸币即可。在日常生活中我们也是这么做的。

//按面值降序structcmp{booloperator()(vector&a1,vector&a2){returna1[0]>a2[0];}};intsolve(vector>&moneyCount,intmoney){intnum=0;sort(moneyCount.begin(),moneyCount.end(),cmp());//首先选择最大面值的纸币for(inti=0;i0)num=-1;returnnum;}多机调度问题问题描述:

structcmp{booloperator()(vector&s1,vector&s2){returns1[1]>&events){sort(events.begin(),events.end(),cmp());intnum=1;inti=0;for(intj=1;j=events[i][1]){++num;i=j;}}returnnum;}无重叠区间问题描述:

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。注意:可以认为区间的终点总是大于它的起点。区间[1,2]和[2,3]的边界相互“接触”,但没有相互重叠。

structcmp{booloperator()(vector&s1,vector&s2){returns1[1]>&intervals){sort(intervals.begin(),intervals.end(),cmp());intnum=1;inti=0;for(intj=1;j=intervals[i][1]){i=j;num++;}}returnintervals.size()-num;}};

THE END
1.贪心算法实例详解(转)Kobe10原文地址:http://blog.csdn.net/qq_32400847/article/details/51336300 这篇帖子总结归纳很到位,值得学习。 分类: 数据结构和算法 好文要顶 关注我 收藏该文 微信分享 Kobe10 粉丝- 27 关注- 25 +加关注 0 0 升级成为会员 ? 上一篇: 贪心算法(转) ? 下一篇: (贪心)加油站绕圈问题 https://www.cnblogs.com/Kobe10/p/6349135.html
2.数学模型数学模型-贪心算法及实例.ppt,贪心算法 问题引入: 有下面几种面值的硬币:一元、五角、一角、五分、一分,假设要付给顾客2.89元的零钱,要求用最少的硬币。 顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某https://max.book118.com/html/2019/0814/6040151111002054.shtm
3.贪心算法教程:入门到实践的简洁指南贪心算法的应用实例与案例分析 背包问题 背包问题是一个经典的优化问题,涉及到决定哪些物品放入背包以最大化其总价值,同时不超过背包的重量限制。贪心算法可以用于解决“完全背包问题”,通过按价值/重量的比例排序物品并逐个加入背包,直到无法再加入为止。 示例代码: https://www.imooc.com/article/351183
4.贪心算法入门详解,经典实例分析贪心算法入门详解,经典实例分析 贪心算法的字面有本是形容人的“贪心”一词,着实有些引人注目,有人说贪心算法是世界上最简单的算法,原因很简单:所有人都很“贪心”,根本不用学,不过,算法会怎样贪心呢? “贪心”的人,事事都想要得到眼前最好的那个,看不到长远的东西,也不为将来最终结果做打算,换句话说,就是https://blog.popkx.com/2307/
5.采用C++实现区间图着色问题(贪心算法)实例详解IT知识教程采用C++实现区间图着色问题(贪心算法)实例详解 本文所述算法即假设要用很多个教室对一组活动进行调度。我们希望使用尽可能少的教室来调度所有活动。采用C++的贪心算法,来确定哪一个活动使用哪一间教室。 对于这个问题也常被称为区间图着色问题,即相容的活动着同色,不相容的着不同颜色,使得所用颜色数最少。https://www.300.cn/itzspd/503783.html
6.算法详解(卷3)——贪心算法和动态规划在本系列图书的卷1中,我们看到了这个算法范例的很多实例:MergeSort和QuickSort算法、Karatsuba的O(n1.59)时间级的两个n位整数相乘算法、Strassen的O(n2.71)时间级的两个n×n矩阵的相乘算法等。 本系列图书卷3的前半部分讨论贪心算法的设计范例。贪心算法的准确定义是什么?关于这个问题,可以说是“唾沫和墨汁横飞”https://www.epubit.com/bookDetails?id=UB831756653320d
7.贪心算法:使用贪心算法实现哈夫曼编码为什么这里贪心算法得不到最优解呢?我们第一步从S->A和第一步从S->B,下一步面对的顶点和边是不一样的。也就是我们前面的选择会影响后面的选择,所以得不出最优解。 2、贪心算法实例分析 接下来,我们再看几个能够使用贪心算法求最优解的问题。 https://www.jianshu.com/p/9caa72f4ac97
8.力扣入门经典题型题目之贪心算法例子和解法:3个孩子饥饿程度为1,2,3,两块饼干大小为1,1。先分给饥饿程度最小的孩子,剩下1块,无法分给更多人了,结果为1. 贪心策略为先将两个数组排序,为了让尽可能多的吃饱 先喂饱饥饿度小的孩子最小的饼干,以此类推。 代码: C++ classSolution{public:intfindContentChildren(vector<int>&children,vector<https://zhuanlan.zhihu.com/p/451744848
9.浅谈Python实现贪心算法与活动安排问题python本篇文章主要介绍了浅谈Python实现贪心算法与活动安排问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 贪心算法 原理:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得https://www.jb51.net/article/130987.htm
10.Java实现贪心算法实例介绍51CTO博客Java 实现贪心算法实例介绍 1.引言 本文将介绍如何用 Java 实现贪心算法。 2.贪心问题 通常一个数学问题会有几种解法。可以迭代解决,也可以用分治法(快速排序算法)或者动态规划(背包问题)这样的高级方法。 大多数情况我们都在寻找最优解,但可悲的是并非每次都能得到期望的结果。某些情况下,即使是次优解也很有用https://blog.51cto.com/u_15127686/2829966
11.贪心算法WOODENSTICKS实例代码贪心算法 WOODEN STICKS 实例代码,需要的朋友可以参考一下 贪心算法 WOODEN STICKS2020-09-05 上传大小:37KB 所需:18积分/C币 用贪心算法解单源最短路径问题 用贪心算法解单源最短路径问题 明确单源最短路径问题的概念;利用贪心算法解决单源最短路径问题;并通过本例熟悉贪心算法在程序设计中的应用方法。 https://www.iteye.com/resource/weixin_38720756-12814957
12.使用贪心算法的分数背包问题Mangs使用贪心算法的分数背包问题 目录:- 一、简介 应用实例 三、算法说明 实施 推论/结论 简介:- 分数背包问题是一个组合优化问题。这意味着它涉及到 n 个在数学意义上具有不同特征(或权重和值)的对象。目标是将这些物品分成几个不同大小的背包,同时最大限度地提高总效用。在这个问题中,总效用由比率值/重量表示,https://devpress.csdn.net/python/62fb8e2a7e6682346618f099.html
13.算法分析与设计期末答案2023秋51.关于Prim算法和Dijkstra算法,以下说法正确的是( )。A:两个算法都需要引入一个数组用于记录一个点是否被访问过 B:两个算法在不优化时的时间复杂度都为O(V^2),V表示顶点的个数 C:两个算法都是贪心算法的经典实例 D:两个算法都包含了松弛操作,在松弛时对相应的数据结构进行更新 内容已经隐藏,点击付费后https://www.wkebb.com/c/776b56604264529595bfd59c2f472142.html
14.贪心算法WOODENSTICKS实例代码贪心算法 WOODEN STICKS 实例代码 Problem Description There is a pile of n wooden sticks. The length and weight of each stick are known in advance. The sticks are to be processed by a woodworking machine in one by one fashion. It needs some time, called setup time, for the machine to https://www.xiuzhanwang.com/a1/Cyuyan/4505.html
15.C++算法集锦(14):贪心算法腾讯云开发者社区贪心算法可以理解为一种特殊的动态规划为题,拥有一些更加特殊的性质,可以进一步降低动态规划算法的时间复杂度。 来看几道题目熟悉一下这种“不断寻求局部最优”的算法。 跳跃游戏 I 输入一个非负整数数组nums,数组元素nums[i]表示的是:如果你站在位置 i ,最多能够往前跳几步。 现在你站在第一个位置nums[0],试https://cloud.tencent.com/developer/article/1879118
16.贪心算法(C语言实现)C语言贪心算法适用的问题:局部最优策略能产生全局最优解。但是实际上,贪心算法适用的情况很少。一般来说,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际实例进行分析,就可做出判断。 C语言贪心算法的一般步骤如下。 建立数学模型来描述问题。 https://www.54benniao.com/a/vts0zi.html