贪心算法讲解

这篇具有很好参考价值的文章主要介绍了贪心算法讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

贪心算法讲解

1. 贪心算法的概念

贪心算法是:用一种局部最功利的标准,总是做出当前看来是最好的选择。如果局部最优解可以得出全局最优解,说明贪心假设成立,否则就失败

举个例子:
贪心算法讲解
这里有一个矩形,里面放着0和1,我们想从左上角走到右下角,然后从右下角走到左上角,怎么走能取到最多的1。规定:左上->右下(只能往右边和下边走),右下->左上(只能往左边和上边走),走过的1都会变成0
贪心算法讲解
如果我们的贪心思想是:左上->右下局部最多1,右下->左上局部最多1。先左上->右下:
贪心算法讲解
这里我们取到了最多的1,但是右下->左上走的时候,取左边的1就取不到右边的1,取右边的1就取不到左边的1。

那么我们可以这样去走:
贪心算法讲解
这样才能得出最多的1,所以前面的贪心思想是错误的。

2. 讲解贪心

题目1:给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中,拼接结果中最小的是什么

首先,大家可能想到的方法是:如果前一个字符串比后一个字符串大,前面的就放在后面,后面的就放在前面

举个例子:
贪心算法讲解
首先可以看到:cks比abc大,所有我们就把abc放前面,cks放后面,就形成了abccks。abccks比ft小,abccks就放在前面,ft就放在后面。就是abccksft。那么这样的一个方法它行不行呢?我们可以找个反例:
贪心算法讲解
b比ba小,那么b就放在前面,ba放在后面。结果就是bba,但是这个字符串不是最小的,bab比bba小。所有这个策略不正确。

正确的策略是:ab<ba,a就放前,否则b就放前
为什么这个策略是对的,我们就需要去证明:ab<=ba,bc<=cb,那么ac<=ca。如果能证明出这个不等式就说明这个策略是对的,但是证明太复杂了,这里就不证明了

代码实现:
贪心算法讲解

题目2:一个项目要占用一个会议室宣,会议室不能同时容纳两个项目的宣讲。给你一个项目的开始时间和结束时间,你来安排宣讲的日程,要求会议室进行的宣讲场次最多

举个例子:
贪心算法讲解
有这么一组数据,如果说,我们按照开始时间最小的来选,那么先选择[1,10],但是如果选择了这个后面三个都不能选了,选择[2,3],[3,5],[6,7]这样选择的场次最多,所以这个贪心思想是错误的。

那么什么方法的贪心思想是正确的呢
答案是:选择结束时间最早的

贪心算法讲解
假设有这么一组数据,我们先按照结束时间来排序:
贪心算法讲解
我们从0时刻开始,那么第一个结束时间最早的是[1,2],选择了这个之后,[1,4]就不能选择了,后面的都能选,结束时间最短的是[2,9],选择这个[3,10]就不能选了,只能选[9,12],所以最多结果就是3个。

代码实现:
贪心算法讲解
创建一个类,代表会议的开始时间和结束时间。
贪心算法讲解
这是比较方法,按照会议结束早的往前排。
贪心算法讲解
排完序之后,按照当前时间和会议的开始时间比较,如果小于等于会议的开始时间就说明可以进行宣讲。

题目3:
贪心算法讲解

解决思路是:
1.创建一个小根堆

贪心算法讲解
这是一组数组,先从小到大排序,然后去构建它的小根堆:
贪心算法讲解
我们每一次弹出两个数,然后把它们两加起来:
贪心算法讲解
加起来之后,放入小根堆里:
贪心算法讲解
再弹出两个数,然后加起来,放入小根堆里面:
贪心算法讲解
再弹出两个数,然后加起来,放入小根堆里面:
贪心算法讲解
重复上面的操作,当小根堆里只有一个数时停止:
贪心算法讲解
我们把所有画圈的数加到一起就是最小值。

代码实现:
贪心算法讲解

题目4:
贪心算法讲解
举个例子:
贪心算法讲解
这里初始资金是2,所以p2,p3都能做,但是p3的利润高,先选择p3。
贪心算法讲解
现在的资金是7,所以p1,p2,p4都能做,p4的利润最高,先选择p4。
贪心算法讲解
现在选出了2个,已经达到了k值,就不能再选择了,所以最大钱数是11。

解题思路:创建一个小根堆和一个大根堆,小根堆里按花费来排,大根堆里按利润来排。
贪心算法讲解
初始资金是2,前面两个符合要求,我们就把前面两个弹出,放到大根组。
贪心算法讲解
我们把大根堆的堆顶元素的利润弹出加到M上。然后弹出。
贪心算法讲解
此时小根堆里面的元素都满足,弹出加到大根堆里。
贪心算法讲解
再把大根堆的堆顶的利润加到M上,然后弹出。已经完成2个了,达到k值。

但是这里还存在一些问题,就是说我们的资金不能去做项目,并且大根堆里面也没有项目时,就直接返回

代码实现:
贪心算法讲解
项目的定义,有花费和利润两个成员函数。
贪心算法讲解
这是两个比较方法,优先级队列的比较有点奇怪,如果要创建小根堆,父亲要比孩子大才会交换,创建小根堆,父亲要比孩子小才会交换。
贪心算法讲解

题目5:
贪心算法讲解
举个例子:
贪心算法讲解
这里的x是墙:一定不能放灯,但是可以点亮,也可以不点亮。
这里点是居民:可以放灯,也可以不放灯,但是一定要点亮。

那么根据上面的条件,最优的放灯是这样的:
贪心算法讲解

解题思路:一共有4种情况。

1.如果i位置是墙,直接i+1
2.如果i位置是灯,i+1位置是墙,在i位置上放灯,然后直接去i+2位置上
3.如果i位置是灯,i+1位置是灯,i+2位置是墙,在i位置上放灯,然后直接去i+3位置上
4.如果i位置是灯,i+1位置是灯,i+2位置是灯,在i位置上放灯,然后直接去i+3位置上

代码实现:
贪心算法讲解文章来源地址https://www.toymoban.com/news/detail-431182.html

到了这里,关于贪心算法讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 具名要求-全库范围的概念 - 一种等价关系(operator==)- 是一种严格弱序关系(operator< )

    此页面中列出的 具名要求 ,是 C++ 标准的规范性文本中使用的具名要求,用于定义标准库的期待。 某些具名要求在 C++20 中正在以概念语言特性进行形式化。在那之前,确保以满足这些要求的模板实参实例化标准库模板是程序员的重担。若不这么做,则可能导致非常复杂的编

    2024年01月21日
    浏览(44)
  • 贪心算法问题实验:贪心算法解决TSP问题

    TSP问题是指旅行商问题,即给定一组城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。它是组合优化中的一个NP困难问题,在运筹学和理论计算机科学中有着广泛的应用。 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最

    2024年02月03日
    浏览(31)
  • 算法竞赛备赛之贪心算法训练提升,贪心算法基础掌握

    905.区间选点 给定N个闭区间[ai, bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量,位于区间端点上的点也算作是区间内。 将每个按区间的右端点从小到大排序 从前往后依次枚举每个区间 如果当前区间中已经包含点,则直

    2024年02月08日
    浏览(28)
  • C++ 具名要求-全库范围的概念 - 建立一种顺序关系的二元谓词 (BinaryPredicate)

    此页面中列出的具名要求,是 C++ 标准的规范性文本中使用的具名要求,用于定义标准库的期待。 某些具名要求在 C++20 中正在以概念语言特性进行形式化。在那之前,确保以满足这些要求的模板实参实例化标准库模板是程序员的重担。若不这么做,则可能导致非常复杂的编译

    2024年01月16日
    浏览(42)
  • 启发式搜索算法:A算法(全局、局部择优算法)+A*算法 解决八数码问题

    参考博客:人工智能搜索策略:A*算法 在图搜索算法中,如果能在搜索的每一步都利用估价函数f(n)=g(n)+h(n)对Open表中的节点进行排序,则该搜索算法为 A算法 。由于估价函数中带有问题自身的启发性信息,因此,A算法又称为启发式搜索算法。 对启发式搜索算法,又可根据搜

    2024年02月10日
    浏览(28)
  • 初级算法-贪心算法

    主要记录算法和数据结构学习笔记,新的一年更上一层楼! 贪心算法 本质找到每个阶段的局部最优,从而推导全局最优 1. 题目 :假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让

    2024年02月03日
    浏览(22)
  • 算法小课堂(五)贪心算法

    贪心算法是一种常见的算法思想,用于解决优化问题。其基本思想是在每一步选择中都采取当前状态下最优的选择,从而希望能够获得全局最优解。 具体来说,贪心算法通常分为以下步骤: 定义问题的最优解,通常需要将问题转化为求最大值或最小值; 选择一个局部最优解

    2024年02月02日
    浏览(31)
  • 贪心算法part01 算法

    ● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和 https://leetcode.cn/problems/assign-cookies/description/ https://leetcode.cn/problems/wiggle-subsequence/description/ https://leetcode.cn/problems/maximum-subarray/description/

    2024年02月02日
    浏览(34)
  • C++算法之贪心算法

    贪心算法是一种求解最优解问题的算法,它的核心思想是每一步都采取当前状态下最优的选择,从而最终得到全局最优解。它是C++重要的一种算法。下面会介绍贪心算法。 目录 1.步骤 1.2 例 2.框架 3.例题 3.1 删数问题 13  3.2 接水问题 (1)确定问题的最优子结构:问题的最优

    2024年01月21日
    浏览(32)
  • 【基础算法】贪心算法

    贪心算法又称贪婪算法,是一种常见的算法思想。贪心算法的优点是效率高,实现较为简单,缺点是可能得不到最优解。 贪心算法就是在求解问题时,总是做出当前看来最好的选择。也就是说贪心算法并不从整体最优上考虑问题,算法得到的是局部最优解。而局部最优解叠加

    2024年02月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包