贪心算法篇

news2024/12/28 5:16:53

“靠漫步,将生趣填饱~” 


贪心算法简介?

         贪心算法(Greedy Algorithm),也称为贪婪算法,是一种在解决问题时采取贪心策略的方法。其基本原理是很简单的:

        在每个决策点上都选择当下看似最好的选项,而不是寻求全局最优点”。

        我们举几个,常使用贪心算法的小例:

找零问题:

        此时你的顾客一手掏出50“大米”递给你,一手拿着一瓶快乐水——“nutrition happy line”(you know,这瓶饮料的价格为4)。现如今,这位顾客正一脸疑惑地盯着你的一举一动,因为你接过纸币后,目不转睛地瞅着那数字不小的“大米”愣神。你总会在感到一股苍劲的凉风过后,两眼冒星,腥咸的液体会被你从口中送入食管——你应当马上给他找零了。拉开你正下方,散发着浓烈朽木味儿的抽屉,你从中看到了无数的纸币,其中的面额如下:[20,  10 , 5 ,1]。你需要使用最少的纸币,完成找零工作:

        已知,我们要给这位虎背熊腰的壮汉的找零数是:46。又要求我们使用最小的纸币数,所以,我们将两张黄旧的、纸面油印为20的纸币重叠好,再选取面额分别为5和1的纸币,一并夹在手指之间,塞给了这位壮汉。我们的选择为:20 * 2 + 5 * 1 + 1 * 1 = 46。总共需要四张纸币,完成这份找零工作。这便是最少使用纸币的解法。

最小路径和:

        这天你命犯桃花,因为本应对你爱答不理、而你却日夜心念的邻家小妹邀请你同她加入到这一场由神秘人创办的乐园探险中。你本以为这仅仅只是一场普通的游乐主题,彼时暗自窃喜,怀揣着想入非非的心思,幻想着邻家小妹把你相拥、同你腻歪的恋爱场景。然而,这场游戏完完全全没有表面看起来那么简单,处处透露着诡异、怪诞,你莫名被卷入到了一场恐怖的布局和惊天的阴谋之中,感受来自黑暗的惊悚:消失的人脸、怪异的乞丐、脱落的车轨以及血腥、压抑的迷宫……

        每个格子的数字,代表着探寻这个九宫格格子的时间。你需要花最少的时间,进入到右下角的最后一个格子之中,从恶魔的祭奠仪式拯救邻家小妹……

        上述的两个例子,对于第一个例子而言,选择的方案:“尽可能选择较大面额的纸币” ,最终我们可以得到“最优解”。相反,对于第二个例子而言,我们的选择是 “选择花费时间较少的格子”进行探索,然而事实上,得出的并不是最优解。

        贪心算法通常会逐步构建问题的解空间,每次尝试将下一个待选元素加入到解集中,直到无法再添加为止。这个过程会使得问题简化为一系列子问题,每个子问题都可以通过同样的贪婪策略来解决,从而逐步接近整体的最优解。

        所谓的这些从局部的角度考虑选择的方案,实质上就是“贪心”策略。然而,“贪心”策略也可能是“错误”的方法,让我们得不出最有解。所以,正确的“贪心”策略,是需要进行验证、证明的


柠檬水找零    

(1) 题目解析

(2) 算法原理              

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        // 记录5$ 10$的个数
        int five = 0,ten = 0;
        for(auto& bill:bills)
        {
            if(bill == 5) five++; // 5$ 直接收下
            else if(bill == 10)
            {
                if(five == 0) return false;  // 没有5$ 不能找零
                else five--;
                ten++;  // 收下10$
            }
            else
            {
                if(five && ten) five--,ten--; // 贪心策略:尽量保留5$
                else if(five > 2) five -= 3;
                else return false;
            }
        }
        return true;
    }
};

 贪心证明:

        贪心只是一种策略,考虑的角度也仅仅是局部的“最优解”,所以,贪心策略也可能是“错误的”

如何确定贪心求得的解就是最优解,还需要进行证明求真。

🥃 证明策略1:交换论证


将数组和减半的最少操作次数         

(1) 题目解析        

(2) 算法原理

class Solution {
public:
    int halveArray(vector<int>& nums) {
        priority_queue<double> pq;
        double sum = 0;
        for(auto n:nums)
        {
            pq.push(n);
            sum += n;  
        }
        sum /= 2.0;

        // 数组减半
        int count = 0; // 记录操作次数
        while(sum > 0)
        {
            double top = pq.top();
            pq.pop();
            top /= 2.0;
            sum -= top;
            pq.push(top);
            count++;
        }
        return count;
    }   
};

贪心证明:

        🍷 交换论证法:


最大数

(1) 题目解析

(2) 算法原理

class Solution {
public:
    string largestNumber(vector<int>& nums) {
        vector<string> strs;
        for(auto x:nums) strs.push_back(to_string(x));
        sort(strs.begin(),strs.end(),[](const string& s1,const string& s2)
        {
            return s1 + s2 > s2 + s1;
        });

        // 提取结果
        string res;
        for(auto& s:strs) res += s;
        // 处理前置0
        if(res[0] == '0') return "0";
        return res;
    }
};

贪心证明:

        似乎,没有看到本题的贪心策略呢? 贪心在何处?


摆动序列

(1) 题目解析

(2) 算法原理        

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        if(nums.size() < 2) return nums.size();

        int ret = 0,left = 0;
        for(int i=0;i < nums.size() - 1;++i)
        {
            int right = nums[i+1] - nums[i];
            if(right == 0) continue;
            if(left * right <=0) ret++;
            left = right;
        }
        // +1表示末尾节点
        return ret + 1;
    }
};

贪心证明:

        🥣 反证法:


本篇到此结束,感谢你的阅读。

祝你好运,向阳而生~

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

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

相关文章

STM32F407移植OpenHarmony笔记9

继上一篇笔记&#xff0c;已经完成liteos内核的基本功能适配。 今天尝试启动OHOS和XTS兼容性测试。 如何启动OHOS&#xff1f; OHOS系统初始化接口是OHOS_SystemInit(void)&#xff0c;在内核初始化完成后&#xff0c;就能调用。 extern void OHOS_SystemInit(void); OHOS_Sys…

异步解耦之RabbitMQ(二)_RabbitMQ架构及交换机

异步解耦之RabbitMQ(一)-CSDN博客 RabbitMQ架构 RabbitMQ是一个基于AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议的消息代理中间件&#xff0c;它通过交换机和队列实现消息的路由和分发。以下是RabbitMQ的架构图&#xff1a; Producer&#xff08;生产…

HubSpot营销自动化如何优化营销流程?

HubSpot营销自动化在优化营销流程、减少手动工作以及提高效率方面发挥着关键作用。以下是一些具体的方法和策略&#xff1a; 1. 自动化电子邮件营销&#xff1a; 利用HubSpot的电子邮件自动化功能&#xff0c;设置触发条件&#xff0c;使邮件发送根据用户行为或阶段自动进行。…

爬虫(二)使用urllib爬取百度贴吧的数据

下一期我就不用urllib来抓取数据了&#xff0c;因为urllib现在已经很少人用&#xff0c;大部分人用得是requests&#xff0c;requests也是基于底层urllib的一个模块。 首先我先来讲一下关于如何使用动态的UA&#xff01; 动态UA就是指在自己创建的一个列表里随机选择一个UA当做…

【C/C++ 11】贪吃蛇游戏

一、题目 贪吃蛇游戏机制是通过控制蛇上下左右移动并吃到食物得分。 蛇头碰到墙壁或者碰到蛇身就游戏结束。 食物随机生成&#xff0c;蛇吃到食物之后蛇身变长&#xff0c;蛇速加快。 二、算法 1. 初始化游戏地图并打印&#xff0c;地图的边缘是墙&#xff0c;地图的每个坐…

移动Web——less

1、less-简介 less是一个CSS预处理器&#xff0c;Less文件后缀是.less。扩充了CSS语言&#xff0c;使CSS具备一定的逻辑性、计算能力注意&#xff1a;浏览器不识别Less代码&#xff0c;目前阶段&#xff0c;网页要引入对应的CSS文件VS code插件&#xff1a;Easy LESS&#xff…

初始数据库

华子目录 什么是数据库DBMS&#xff08;数据库管理系统&#xff09;数据库系统和文件系统的区别文件系统数据库系统对比区别优缺点总结 常见数据库关系型数据库ACID原则关系型数据库的优缺点优点缺点 非关系型数据库存储方式常见的非关系型数据库非关系型数据库的优缺点优点缺点…

OpenSSL:configure: error: OpenSSL library not found解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

MATLAB计算多边形质心/矩心

前言&#xff1a;不规则四边形的中心 不规则四边形的出心有多种定义&#xff0c;以下是最常见的三种&#xff1a; 1.重心&#xff1a;重心是四边形内部所有顶点连线交点的平均位置。可以通过求解四个顶点坐标的平均值来找到重心。 2.质心&#xff1a;质心是四边形内部所有质点…

网络原理-TCP/IP(5)

TCP协议 延迟应答 它也是基于滑动窗口,提高效率的一种机制,结合滑动窗口以及流量控制,能够以延迟应答ACK的方式,把反馈的窗口,搞大.核心在于允许范围内,让窗口尽可能大. 如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小. 1.假设接收端缓冲区为1M.一次收到了5…

一站式SpringBoot学习平台:让编程变得轻松有趣!

介绍&#xff1a;Spring Boot是一个开源的Java框架&#xff0c;旨在简化Spring应用程序的开发和部署过程。 Spring Boot由Pivotal团队设计并推出&#xff0c;它的核心优势在于极大地简化了传统Spring应用的初始搭建和开发流程。具体来说&#xff0c;Spring Boot的主要特点包括&…

git 合并多条提交记录

我要合并多条提交记录&#xff08;合并前7条为一条&#xff09;&#xff0c;实现如下效果&#xff1a; 使用git rebase // 查看前10个commit git log -10 // 将7个commit压缩成一个commit&#xff1b;注意&#xff1a;vim编辑器 git rebase -i HEAD~4 // add已经跟踪的文件 g…

C++11多线程:线程的创建及启动

文章目录 启动线程传递函数对象为参数传递成员函数为参数传递全局函数为参数传递lambda函数为参数也可调用std::thread的无参构造 join()、joinable()、detach() 等函数Join函数detach 函数joinable函数 Join函数到底干了什么&#xff1f;必须join或者detach吗&#xff1f;线程…

AI少女/HS2甜心选择2 仿碧蓝航线人物卡全合集打包

AI少女/HS2甜心选择2 仿碧蓝航线人物卡全合集打包 内含&#xff1a;埃吉尔 女仆装花园 新泽西 白雪之仪库尔斯克信浓泳装埃吉尔风纪委员大凤路易九世旗袍能代夜响的绝园英仙座 护士 下载地址&#xff1a; https://www.changyouzuhao.cn/13366.html

springboot153相亲网站

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

ONLYOFFICE 8.0 测评:重塑办公新标杆,你绝对不能错过的版本!

ONLYOFFICE 8.0 测评&#xff1a;办公新境界的全新突破 一、全新的界面设计二、可填写的 PDF 表单 免费表单模板三、双向文本四、电子表格中的新增功能五、协作功能升级六、跨平台性能优化七、强化安全性八、更丰富的插件生态九、辅助功能&#xff1a;优化的屏幕朗读器 随着科…

程序员阿宝过年-UMLChina建模知识竞赛第5赛季第5轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。 如果有第4题&#xff0c;第4题为附加题&am…

Ubuntu+GPU搭建Stable-Diffusion教程

【前序】已经安装anaconda 1.git拉取项目到本地 执行git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git 进入项目目录下 cd stable-diffusion-webui/ 2. 安装对应Python依赖包 首先安装pytorch和torchvision&#xff0c;若是GPU环境的用户需要安装与cu…

[基础IO]动静态库{创建/使用/加载}

文章目录 1.创建静态库2.使用静态库3.动态库 1.创建静态库 预备知识: gcc main.c mymath.c myprint.c -o my.exe / gcc main.o mymath.o myprint.o -o my.exe三个.c/.o文件可以编译成为可执行程序 编写源文件与头文件[库的源文件没有main函数]将所有的源文件编译生成.o文件。(…

电工需要掌握的电路

1、通用型变频器接线示意图 2、三线式运转控制台达正反转电路图 3、单相220V接线实物图、三相380V接线实物图 4、变频器操作面板功能介绍 5、风暖浴霸实物接线电路图 6、车辆出入门闸检测实物接线电路图 7、电位器实现两台变频器同步调频实物接线图 8、门禁系统是如何工作的实物…