【4.17】贪心算法入门

news2024/11/25 18:29:48

什么是贪心?

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

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

贪心的解题步骤?

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

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

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

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

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

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)

    思路一:贪心算法

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

    376.摆动序列

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

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

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

    该题一共有三种情况:

    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;
        }
    }
    

    解法三:暴力解法(超时)

    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;
        }
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/425842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《人体地图》笔记

《人体地图》 坂井建雄 著 孙浩 译 腹部通向大腿的隧道 腹部与大腿的分界点是大腿根部&#xff0c;即是腹股沟。 腹壁肌肉连结在腹股沟韧带上&#xff0c;腹壁肌肉包括三层&#xff0c;分别为腹外斜肌、腹内斜肌和腹横肌&#xff0c;每块肌肉都有一个张开的小孔&#xff0c;…

【靶场设计和渗透】

目录 一、前言 二、靶场设计 1、局域网 2、说明 三、渗透测试 1、信息收集 2、漏洞利用 四、后渗透利用 1、提权 2、权限维持 一、前言 为了深入贯彻学习网络安全法律法规&#xff0c;深入学习渗透测试知识&#xff0c;强化实战技能............ 编不出来了&#xff…

The Sandbox 的 OliveX Fitness 之城来啦!

4 月 11 日至 17 日&#xff0c;亲自来体验一下吧&#xff01; 这种独特的体验将有趣和故事驱动的游戏与健身以及奖励结合起来。玩家可以探索隐藏的角落&#xff0c;逃出迷宫&#xff0c;爬上梯子&#xff0c;清除障碍&#xff0c;完成相互关联的任务&#xff0c;所以战略规划是…

Avue dynamic表单实现form单选,修改及新增项

Avue dynamic表单实现form单选&#xff0c;修改及新增项 AvueDialogFormTableViewOption.js /** Description:银行账号* Version: 1.0* Autor: Tj* Date: 2023-03-21 11:02:42*/ export const BankAccountOption (vueObj, formData) > {return {labelWidth: 100, //整体列…

【华为OD机试】1046 - 计算字符串的编辑距离

文章目录一、题目&#x1f538;题目描述&#x1f538;输入输出&#x1f538;样例1二、思路解析三、代码参考作者&#xff1a;KJ.JK&#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f…

GDPU C语言 天码行空8

1. 求序列和 ⭐ 输出没有小数的浮点数 #include <stdio.h>double fun(int a, int n) {double res 0;int aa a,i;//aa 记录每一项for(i 1; i < n; i){res aa;aa aa * 10 a;}return res; }int main(){int a,n;scanf("%d %d", &a,&n);printf(&q…

Linux学习笔记——HTTPS协议

文章目录HTTPS是什么什么是加密为什么要进行加密常见的加密方式数据摘要与数据指纹数字签名HTTPS的工作过程探究方案1—只使对称加密方案2—只使非对称加密方案3—双方都是用非对称加密方案4—非对称加密对称加密中间人攻击证书方案5—非对称加密对称加密证书认证HTTPS是什么 H…

hypack单波束采集和处理基本流程

前两天有个读者问是否有单波束测深的操作和处理的步骤&#xff0c;在xiaok海洋测绘网上用关键字“单波束”搜索的结果就是确实没有相关的文章&#xff0c;相关的文章都是外业过程记录。下面以单波束XX&#xff08;可以是任何单波束&#xff09;和采集处理软件Hypack为例说明单波…

树莓派通过网线连接笔记本实现笔记本电脑Wifi的网络共享

基于windows电脑连接树莓派进行设置&#xff1a;通过通过一根网线&#xff0c;连接树莓派和电脑&#xff0c;使电脑和树莓派构成一个局域网&#xff0c;然后树莓派接收来自笔记本电脑wifi网络的共享网络。操作方法类似台式机通过网线共享笔记本电脑无线网络的步骤 1、 保证笔记…

[c++整人代码]超级加倍,让人承认自己是大傻猪

㊀程序介绍 这是本人看到的一个整人小病毒&#xff0c;唯一的杀伤力就是逼着你想坑的人承认他是猪。 本次更新&#xff1a;要求运行程序的人手动输入“我是猪”三个字 ㊁程序截图 1 本程序的窗口会自动保持最前 2 无法关闭本窗口 ㊂代码展示&#xff1a; #include <Wi…

【pinia持久化存储】使用pinia和pinia-plugin-persistedstate依赖进行数据的持久化存储

简言 使用pinia和pinia-plugin-persistedstate依赖进行数据的持久化存储。 存储方式 &#xff1a; localStoragesessionStorage pinia-plugin-persistedstate 中文官网 pinia 中文官网 安装 安装和使用 pinia &#xff0c;请参考使用pinia文章。 安装 pinia-plugin-pers…

使用PDF猫怎么将PNG图片转化成JPG格式图片?

如需了解更多办公应用的相关教程&#xff0c;可到赛效官方网站的应用资讯栏目或者应用问答栏目下查看更多。 TXT文本工具是微软操作系统上附带的一种文本格式&#xff0c;打开速度比较快&#xff0c;且记录文字内容时比较便捷且快速&#xff0c;但是很多时候记录成TXT文本的工…

八大排序算法(冒泡排序、快速排序、堆排序.....)

每坚持一天&#xff0c;offer就会离我更近一步&#x1f339; 文章目录冒泡排序选择排序插入排序希尔排序快速排序计数排序堆排序归并排序冒泡排序 算法描述&#xff1a;从第一个元素开始&#xff0c;两两比较&#xff0c;如果前者比后者大&#xff0c;那么就将两者进行交换&am…

[oeasy]python0133_[趣味拓展]颜文字_流石兄弟_表情文字_2ch_kaomoji

颜文字 回忆上次内容 上次我们了解unicode 里面有各种字体 甚至还有emoji emoji 本质上也是文字 按照unicode的方式编码存储时按照utf-8的方式编码显示时按照系统定义的方式进行显示 还有什么好玩的亚文化吗&#xff1f;&#x1f914; emoticon 1982 年 9 月 19 日 诞生了第…

docker安装rabbitmq的延迟队列插件

1.进入rabbitmq镜像 docker exec -it rabbitmq bash2.查看rabbitmq版本号&#xff0c;方便查找对应版本的延迟队列插件 rabbitmqctl version2.查询rabbitmq插件列表 rabbitmq-plugins list若没有rabbitmq_delayed_message_exchange-xxx.ez&#xff0c;则可以去[延迟队列插件…

win11家庭版 使用vm进行虚拟化的设置(此平台不支持虚拟化的 Intel VT-x/EPT。)

一、安装vm,进入BIOS设置虚拟化&#xff08;vm安装16.2以上版本&#xff09; 这个网上很多&#xff0c;就不说了 二、此时安装vm,创建虚拟机就没问题了&#xff0c;但是想继续再虚拟化&#xff0c;将会有一个问题“此平台不支持虚拟化的 Intel VT-x/EPT。” &#xff08;很多…

中移链系统合约管控功能介绍

中移链是在满足我国信息化监管需求、合规可控的前提下&#xff0c;打造的中国移动区块链服务平台。如果把中移链类比为计算机系统&#xff0c;那么系统合约就是中移链中的系统设置部分&#xff0c;用于配置和管理链的资源和行为。在计算机系统中,系统设置提供了对计算机系统的底…

SE11/SM30 维护视图

文章目录创建维护视图偶遇错误创建维护视图 首先我们现在SE11中创建一个透明表,然后点击如下图 需要我们创建一个函数组,他的目的是为了让系统生成相应的代码放在这个函数组中,也可以说是SM30的操作界面;点击上面的保存就可以了 注意在输入屏幕编号的时候切记不要和其他的维护…

ChatGPT背后的逻辑

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl OpenAI与ChatGPT OpenAI是一个美国的人工智能&#xff08;AI&#xff09;研究实验室&#xff0c;由非营利组织OpenAI Incorporated和其盈利子公司OpenAI Limited Partnersh…

HTTPS 加密简析

1 前言 HTTPS采用的是对称加密和非对称加密的混合加密方法。 密码学知识可以查看我的这篇博客 CISSP考试要求里的“应用密码学”内容辅助记忆趣味串讲_晓翔仔的博客-CSDN博客 2.HTTPS加密过程 https在建立链接时是非对称加密&#xff0c;建立链接后是对称加密。 步骤1 客户端…