【4.17】贪心算法入门

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

什么是贪心?

贪心的本质是选择每一阶段的局部最优,从而达到全局最优

刷题或者面试的时候,手动模拟一下感觉可以局部最优推出整体最优,而且想不到反例,那么就试一试贪心

贪心的解题步骤?

贪心算法一般分为如下四步:

  • 将问题分解为若干个子问题
  • 找出适合的贪心策略
  • 求解每一个子问题的最优解
  • 将局部最优解堆叠成全局最优解

这个四步其实过于理论化了,我们平时在做贪心类的题目 很难去按照这四步去思考,真是有点“鸡肋”。

做题的时候,只要想清楚 局部最优 是什么,如何推导出全局最优,其实就够了。

总之,说白了就是常识性推导加上举反例

LeetCode

  • 455. 分发饼干 - 力扣(LeetCode)

    局部最优是大饼干分给胃口大的小朋友,并且推不出反例,还能推导出全局最优。

    class Solution {
        public int findContentChildren(int[] g, int[] s) {
            Arrays.sort(g);
            Arrays.sort(s);
            int count = 0;
            //表示当前使用的
            //局部最优:大饼干给胃口大的
            //全局最优,可以满足最多的孩子。
            int index = s.length - 1;
            for(int i = g.length - 1 ; i >= 0 ; i --){
                if(index >= 0 && s[index] >= g[i]){
                    count ++;
                    index --;
                }
            }
            return count;
        }
    }
    
  • 376. 摆动序列 - 力扣(LeetCode)

    思路一:贪心算法

    局部最优:删除单调坡度上的节点,那么这个坡度可以有两个局部峰值。

    【4.17】贪心算法入门

    整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列。

    实际操作上,其实连删除的操作都不用做,因为题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了(相当于是删除单一坡度上的节点,然后统计长度)

    这就是贪心所贪的地方,让峰值尽可能的保持峰值,然后删除单一坡度上的节点

    该题一共有三种情况:

    1. 上下坡中有平坡

    2. 数组首尾两端

    3. 单调坡中有平坡

    class Solution {
        int len = 0;
        int ans = 0;
        public int wiggleMaxLength(int[] nums) {
            if(nums.length <= 1) return nums.length;
            int index = 0;
            int curDiff = 0; //当前一对差值
            int preDiff = 0; //前一对差值
            int result = 1; //记录峰值个数,序列默认最右边有一个峰值。
            for(int i = 0 ; i < nums.length - 1 ; i ++){
                curDiff = nums[i + 1] - nums[i];
                //如果出现峰值,就统计结果。
                //为什么允许preDiff = 0 ? 为了应对上下坡中有平坡的这种情况。
                //为什么result初始为 1? 为了统计数组最左面和最右面的值。
                //为什么找到峰值才更新preDiff? 为了应对单调坡度有平坡的情况。preDiff不能实时更新。
                if((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)){
                    result ++;
                    preDiff = curDiff;
                }
            }
            return result;
        }
    }
    
  • 53. 最大子数组和 - 力扣(LeetCode)

    解法一:动态规划

    class Solution {
        public int maxSubArray(int[] nums) {
            //dp[i]:nums中下标i之前(包括i)的最大连续子数组之和为dp[i]。
            int n = nums.length;
            int [] dp = new int [n];
            dp[0] = nums[0];
            int ans = nums[0];
            for(int i = 1 ; i < nums.length ; i++){
                dp[i] = Math.max(nums[i] , dp[i - 1] + nums[i]);
                ans = Math.max(ans , dp[i]);
            }
            return ans;
        }
    }
    

    解法二:贪心算法,局部最优:碰到为负数的连续和,就将连续和置为0。

    最终会得到全局最优:找到最大的子数组和。

    class Solution {
        public int maxSubArray(int[] nums) {
            int count = 0;
            int result = Integer.MIN_VALUE; 
            for(int i = 0 ; i < nums.length ; i ++){
                count += nums[i];
                if(count > result){
                    result = count;
                }
                if(count <= 0){
                    count = 0;
                }
            }
            return result;
        }
    }
    

    解法三:暴力解法(超时)文章来源地址https://www.toymoban.com/news/detail-417008.html

    class Solution {
        public int maxSubArray(int[] nums) {
            int count = 0;
            int result = Integer.MIN_VALUE; 
            for(int i = 0 ; i < nums.length ; i ++){
                for(int j = i ; j < nums.length ; j ++){
                    count += nums[j];
                    result = count > result ? count : result;
                }
                count = 0;
            }
            return result;
        }
    }
    

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

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

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

相关文章

  • 【项目 计网6】 4.17 TCP三次握手 4.18滑动窗口 4.19TCP四次挥手

    TCP 是一种 面向连接 的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如 IP 地址、端口号等。 TCP 可以看成是一种字节流,它会处理 IP 层或以下的层的丢包、重复以及错误问题。

    2024年02月10日
    浏览(41)
  • 贪心算法的基本思想是什么

    贪心算法(Greedy Algorithm)是一种在求解问题时,每一步都选择当前最优解,以期望最终得到全局最优解的算法思想。贪心算法的基本思想可以总结为“每一步都做出一个局部最优的选择,最终就能得到全局最优解”。 贪心算法通常包含以下关键步骤: 找到可选的子问题:

    2024年02月02日
    浏览(40)
  • 贪心算法:基础入门篇

    在求最优解的问题中,以某种贪心标准,从状态的最初始找到每一步最优解,通过多次的贪心求解,最终得到整个问题的最优解,此种解题的方法为贪心算法。可见贪心算法并不是一种固定的算法,而是根据问题的条件而产生的一种解决问题的思维模式。 由定义可知,贪心算

    2024年02月13日
    浏览(26)
  • 【Python】贪心算法入门

    本文将通过两个问题和两道例题带你入门贪心算法。 贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最优(最好或最有利)的选择,从而希望导致全局最优解的算法。贪心算法不保证找到全局最优解,但通常可以快速找到一个接近最优解的解。 即为给你

    2024年01月20日
    浏览(30)
  • 算法分析与设计-会场安排问题(贪心)(通俗易懂,附源码和图解,含贪心选择性质和最优子结构性质的证明)(c++)

    (一)题目 问题描述 假设在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点有着不同颜色的最小着色数,相当于

    2024年02月07日
    浏览(88)
  • 入门opencv,欢笑快乐每一天

     🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝 🥰 博客首页: knighthood2001 😗 欢迎点赞👍评论🗨️ ❤️ 热爱python,期待与大家一同进步成长!!❤️ 👀 给大家推荐一款很火爆的刷题、面试求职网站 👀 跟我一起来刷题吧 先上结果,已成习惯(以下只截取了一部分) 本篇文章主

    2024年02月12日
    浏览(31)
  • 入门ElasticSearch :为什么选择ES作为搜索引擎?

    随着数据量的不断增长,搜索和分析大规模数据集变得越来越重要。传统数据库在面对这种需求时往往表现不佳,这时候就需要一种专门用于搜索和分析的引擎。ElasticSearch (简称ES)就是这样一款强大的搜索引擎,它具有许多优势,使得它成为许多企业和开发者的首选。 简

    2024年02月09日
    浏览(46)
  • Python入门教程+项目实战-11.5节: 程序实战-选择排序算法

    目录 11.5.1 排序算法简介 11.5.2 选择排序算法 11.5.3 系统学习python 所谓排序,是指将数据集合中的元素按从小到大的顺序进行排列,或按从大到小的顺序进行排列。前者称为升序排序,后者称为降序排序。在数据结构与算法这门课程中,我们会学习到诸多与排序相关的算法,

    2024年02月02日
    浏览(50)
  • 对于 Git 每一次提交的时间信息,什么是作者日期和提交者日期

    对于 Git 的每一次提交,在 TortoiseGit 和 IntelliJ IDEA 都可以看到这次提交的时间。但很多人不知道的是,Git 实际上对每一个提交的时间分为两个:作者日期和提交者日期。 作者日期(author date):这指的是最开始提交时,所产生的提交文件上的日期 提交者日期(committer date):

    2024年02月05日
    浏览(46)
  • 反向代理的本质是什么?

    反向代理是一种网络架构模式,通常用于提供静态内容、处理安全、负载均衡和缓存等任务。在这种架构中,客户端发送的请求首先到达反向代理服务器,然后由反向代理服务器将请求转发给后端的实际服务器。反向代理服务器可以处理和修改请求和响应,以便提供缓存、安

    2024年01月16日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包