【贪心算法】专题练习一

news2024/11/19 7:31:16

在这里插入图片描述

欢迎来到Cefler的博客😁
🕌博客主页:那个传说中的man的主页
🏠个人专栏:题目解析
🌎推荐文章:题目大解析(3)

在这里插入图片描述


前言
1.什么是贪心算法?——贪婪+鼠目寸光

贪心策略:解决问题的策略,局部最优->全局最优
(1)即把解决问题的过程分为若干步
(2)解决每一步的时候吗,都选择当前看起来“最优的”解法
(3)希望得到全局最优解

2.贪心算法的特点
(1) 贪心策略的提出是没有标准以及模板的
(2) 可能每一道题的贪心策略都是不同的
(3)贪心策略的正确性:可能会出错;正确的贪心策略,我们是需要“证明的”

3.证明贪心策略的方法:数学中见过的所有证明方法

4.学习贪心的方向
(1):遇到不会的贪心题,很正常,把心态放平
(2):把策略当成经验吸收
(3):能证明则证明贪心策略的正确性


目录

  • 👉🏻柠檬水找零
    • 证明
  • 👉🏻将数组和减半的最少操作次数
    • 证明
    • priority_queue
      • 注意事项
  • 👉🏻最大数

👉🏻柠檬水找零

原题链接:柠檬水找零

mycode:

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int five = 0,ten = 0,twenty = 0;
        for(auto e:bills)
        {
            if(e==5)
            {
                five++;
            }
            else if(e==10)
            {
                ten++;
                if(--five<0)
                    return false;
            }
            else if(e==20)
            {
                twenty++;
                //10+5 && 5+5+5 都不可以才找零失败
                int tmp1 = ten,tmp2 = five,tmp3 = five;
                if(--tmp1>=0&&--tmp2>=0)
                {
                    --ten;
                    --five;
                }
                else if((tmp3-=3)>=0)
                {
                    five-=3;
                }
                else
                    return false;
            }
        }
        return true;
    }
};

证明

交换论证法
在这里插入图片描述

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

原题链接:将数组和减半的最少操作次数

mycode:

class Solution {
public:
    int halveArray(vector<int>& nums) {
        priority_queue<double> heap;//默认大堆
        double sum = 0.0;
        for(auto e:nums)
        {
            heap.push(e);
            sum+=e;
        }
        sum/=2.0;
        int count = 0;
        while(sum>0)
        {
            double t = heap.top()/2.0;
            heap.pop();
            sum-=t;
            count++;
            heap.push(t);
        }
        return count;
    }
};

在这里插入图片描述

证明

在这里插入图片描述

priority_queue

当涉及到按照特定顺序处理元素时,C++ 的 std::priority_queue 是一个非常有用的容器适配器。它是一个基于堆的数据结构,用于实现优先级队列。在优先级队列中,元素按照其优先级被处理,具有较高优先级的元素先被处理。

以下是 std::priority_queue 的基本特征和用法:

包含头文件

#include <queue>

创建优先级队列

std::priority_queue<int> pq;  // 创建一个默认的最大堆

插入元素

pq.push(10);
pq.push(5);
pq.push(20);

访问顶部元素

int topElement = pq.top();  // 获取最高优先级的元素,但不删除

删除顶部元素

pq.pop();  // 删除最高优先级的元素

自定义比较函数
如果你想要自定义元素的比较方式,可以通过提供自定义比较函数来实现。以下是一个示例,创建一个最小堆:

#include <functional>

std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;

或者,你也可以自定义比较函数

struct Compare {
    bool operator()(int a, int b) {
        // 自定义比较逻辑,返回 true 表示 a 的优先级高于 b
        return a > b;
    }
};

std::priority_queue<int, std::vector<int>, Compare> customQueue;

注意事项

  • 默认情况下,std::priority_queue 是一个最大堆,但你可以通过提供第三个参数(比较函数)来改变其行为。
  • std::priority_queue 不提供迭代器访问元素的方式,因为堆不是线性结构。
  • 在使用自定义比较函数时,确保比较函数是严格弱序(strict weak ordering),以确保正确的行为。

👉🏻最大数

原题链接:最大数

mycode:

class Solution {
public:
    string largestNumber(vector<int>& nums) {
        vector<string> v;
        for(auto e:nums)
        {
            v.push_back(to_string(e));
        }
        //给v排序
        sort(v.begin(),v.end(),[](const string& s1,const string& s2)->bool
        {
            return s1+s2>s2+s1;
        }
        );
        string ret;
        for(auto e:v)
        {
            ret+=e;
        }
        if(ret[0]=='0')return "0";
        return ret;
    }
};

证明贪心策略
这里即证明为什么这里可以排序
在这里插入图片描述

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

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

相关文章

【Windows】共享文件夹拍照还原防火墙设置(入站,出站设置)---图文并茂详细讲解

目录 一 共享文件夹(两种形式) 1.1 普通共享与高级共享区别 1.2 使用 二 拍照还原 2.1 是什么 2.2 使用 三 防火墙设置&#xff08;入栈&#xff0c;出站设置&#xff09; 3.1 引入 3.2 入站出站设置 3.2.1入站出站含义 3.3入站设置 3.4安装jdk 3.5使用tomcat进行访…

【C#】Visual Studio 2022 远程调试配置教程

在某些特殊的情况下&#xff0c;开发机和调试机可能不是同一台设备&#xff0c;此时就需要远程调试了。 开发机配置 首先需要确保两台机器在同一局域网下。 创建共享文件夹 随便找个地方新建一个文件夹&#xff0c;用来放编译结果。例如我这里是 D:\DebuggingWorkspace\。 …

git集成github(一):主要步骤

一、创建仓库 1、创建本地git仓库 在pcharm主界面顶栏&#xff0c;点击VCS&#xff0c;再点击创建git仓库&#xff0c;然后选择项目根路径&#xff0c;点击确认。这时&#xff0c;可以看到顶栏的VCS变成了git。 2、远程仓库下载到本地 打开一个远程仓库&#xff0c;点击code…

“C语言“——scanf()、getchar() 、putchar()、之间的关系

scanf函数说明 scanf函数是对来自于标准输入流的输入数据作格式转换&#xff0c;并将转换结果保存至format后面的实参所指向的对象。 而const char*format 指向的字符串为格式控制字符串&#xff0c;它指定了可输入的字符串以及赋值时转换方法。 简单来说给一个打印格式(输入…

PYTHON数据处理:CSV和JSON

#CSV和JSON格式的数据在python上的处理 CSV和JSON数据类型都是都是常见的两种在python中的数据分析类型&#xff0c;这里我有两个入门项目详细讲解这两种数据的处理。 处理一个CSV形式的地方的天气的数据&#xff0c;然后创建一个表格&#xff1b; 分析JSON形式的地震数据&…

扩展mybatis-plus,保留逻辑删、逻辑查的前提下,扩展硬删除、硬查询

引入相关依赖 <!-- 提示&#xff1a;1. common-mybatis-plus:2100.8.8 中只有4个类文件&#xff0c;是对硬删除、硬查询的扩展支持&#xff0c;如果你不想引入依赖的话&#xff0c;你可以把这四个文件复制到自己的项目中即可2. common-mybatis-plus:2100.8.8 对应mybatis-p…

CEEMDAN +组合预测模型(CNN-LSTM + ARIMA)

目录 往期精彩内容&#xff1a; 前言 1 风速数据CEEMDAN分解与可视化 1.1 导入数据 1.2 CEEMDAN分解 2 数据集制作与预处理 3 基于CEEMADN的 CNN-LSTM 模型预测 3.1 定义CEEMDAN-CNN-LSTM预测模型 3.2 定义模型参数 3.3 模型训练&#xff0c;训练结果 4 基于ARIMA的…

数据结构与算法:基于比较的排序算法:选择、冒泡、插入、归并的动图演示和java代码,排序时间复杂度、空间复杂度、稳定性总结表格

选择排序 选择排序是先在0~N-1上选择一个最小值排到最前面&#xff0c;然后再在1到N-1上选一个次小的&#xff0c;以此类推。 public static selectionSort(int[] arr){if(arrnull||arr.length<2){return;} //每次从i n-1 选一个最小的放前面for(int i0;i<arr.length-…

深入Apache Commons Config:管理和使用配置文件

第1章&#xff1a;引言 咱们都知道&#xff0c;在软件开发中&#xff0c;管理配置文件是一件既重要又让人头疼的事。想象一下&#xff0c;咱们的应用程序有一堆设置需要调整&#xff0c;比如数据库的连接信息、应用的端口号&#xff0c;或者是一些功能的开关。如果这些信息硬编…

Spring高手之路-SpringBean的生命周期

目录 SpringBean的生命周期 整体介绍 详细介绍 1.实例化Bean 2.设置属性值 3.检查Aware 4.调用BeanPostProcessor的前置处理方法 5.调用InitializingBean的afterPropertiesSet方法 6.调用自定义init-method方法 7.调用BeanPostProcessor的后置处理方法 8.注册Destru…

【深入之Java进阶篇】fastjson的反序列化漏洞(详解总结)

✔️ fastjson的反序列化漏 1️⃣典型解析2️⃣拓展知识仓1️⃣AutoType2️⃣AutoType 有何错?3️⃣ 绕过checkAutotype&#xff0c;黑客与fastjson的博弈4️⃣autoType不开启也能被攻击?5️⃣利用异常进行攻击6️⃣AutoType 安全模式? 1️⃣典型解析 当我们使用fastjson进行…

ueditor富文本编辑器中图片上传地址配置以及抓取远程图片地址的配置

一&#xff1a;图片上传保存地址配置 打开文件ueditor.php,找到imagePathFormat进行修改即可 一&#xff1a;远程抓取图片配置 打开文件ueditor.config.js,找到catchRemoteImageEnable&#xff0c;取消注释即可

Unity之ShaderGraph如何实现瓶装水效果

前言 有一个场景在做效果时,有一个水瓶放到桌子上的设定,但是模型只做了个水瓶,里面是空的,所以我就想办法,如何做出来瓶中装睡的效果,最好是能跟随瓶子有液体流动的效果。 如下图所示: 水面实现 水面效果 液体颜色设置 因为液体有边缘颜色和内里面颜色,所以要分开…

strlen和sizeof的初步理解

大家好我是Beilef&#xff0c;一个美好的下我接触到编程并且逐渐喜欢。我虽然不是科班出身但是我会更加努力地去学&#xff0c;有啥不对的地方请斧正 文章目录 目录 文章目录 前言 想必大家对sizeof肯定很了解&#xff0c;那对strlen又了解多少。其实这个问题应该让不少人困扰。…

内网穿透的应用-Ubuntu安装XRDP远程桌面结合内网穿透实现远程桌面Ubuntu

文章目录 一、 同个局域网内远程桌面Ubuntu二、使用Windows远程桌面连接三、公网环境系统远程桌面Ubuntu1. 注册cpolar账号并安装2. 创建隧道&#xff0c;映射3389端口3. Windows远程桌面Ubuntu 四、 配置固定公网地址远程Ubuntu1. 保留固定TCP地址2. 配置固定的TCP地址3. 使用…

python 通过opencv及face_recognition识别人脸

效果&#xff1a; 使用Python的cv2库和face_recognition库来进行人脸检测和比对的 0是代表一样 认为是同一人。 代码&#xff1a; pip install opencv-python pip install face_recognition# 导入cv2库&#xff0c;用于图像处理 import cv2 # 导入face_recognition库&#…

【MySQL】数据库之事务

目录 一、什么是事务 二、事务的ACID是什么&#xff1f; 三、有哪些典型的不一致性问题&#xff1f; 第一种&#xff1a;脏读 第二种&#xff1a;不可重复读 第三种&#xff1a;幻读 第四种&#xff1a;丢失更新 四、隔离级别有哪些&#xff1f; &#xff08;1&#xf…

Sublime Text 4 中文汉化教程(Version: Build 4169)

Sublime Text 4汉化 1 知识小课堂1.1 sublim简介1.2 其他编辑器 2 安装过程2.1 安装Install Package Control2.2 Install Package2.3 安装工具包2.4 常用的插件2.5 安装中文包 1 知识小课堂 1.1 sublim简介 Sublime是一款代码编辑器&#xff0c;致力于为开发人员提供快速、高…

IDEA 控制台中文出现乱码问题解决

一、问题概述 请看下图 二、问题分析 IDEA控制台输出乱码一般会有三种来源&#xff1a; ① IDEA本身编码错误 ② Tomcat日志输出编码错误 ③ 项目本身原因。 终极原因&#xff1a;IDEA编码和Tomcat编码不一致&#xff0c;统一设置为UTF-8即可。 三、解决思路 修改…

双向循环链表实现C语言关键字中英翻译机 ฅ( ̳• · • ̳ฅ)

目录 1.双向循环链表的声明与定义&#xff1a; 2. 创建链表并对节点中的数据赋初值 3. 插入节点并链接 4.中英翻译 5. 小游戏的实现 6.菜单的实现 7. 释放内存 8.在主函数中用刚才定义的函数实现各种代码 输入样例&#xff1a; 实现方法&#xff1a;双向循环链表来实…