贪心算法【1】

文章目录

    • 860. 柠檬水找零
      • 题目解析
      • 算法原理
      • 代码实现
      • 交换论证法
    • 2208. 将数组和减半的最少操作次数
      • 题目解析
      • 算法原理
      • 代码实现
      • 交换论证法
    • 179. 最大数
      • 题目解析
      • 算法原理
      • 代码实现

860. 柠檬水找零

题目链接:860. 柠檬水找零

题目解析

一杯柠檬水5块钱,每个顾客每次只能买一杯,支付的现金的面额有5块、10块、20块。

我们需要能够正确的找零,而且最开始我们手里没有钱。

如果遇上不能找零的,则返回false;如果从始至终能够正确找零,返回true。

  • bills:顾客支付的钱的面额

算法原理

分情况讨论:

  • 顾客给5块,收下

  • 顾客给10块,手上有5块,给5块,然后收下10块;没有返回false

  • 顾客给20块

    1. 给三张5块
    2. 给一张5块,一张10块

    此时这里就能体现贪心,5块钱可以在10块那里用,也可以在20块这里用,所以要尽可能保留5块钱。

    所以优先选择给一张5块和一张10块。

代码实现

class Solution {
public:
    bool lemonadeChange(vector<int>& bills)
    {
        if(bills[0] != 5)   return false;
        //unordered_map<int, int> hash;
        int five = 0;
        int ten = 0;
        for(auto e : bills)
        {
            if(e == 5)  five++;
            else if(e == 10)
            {
                if(five == 0)   return false;
                
                five--;
                ten++;
            }
            else
            {
                if(five != 0 && ten != 0)
                {
                    five--;
                    ten--;
                }
                else if(five >= 3)
                {
                    five -= 3;
                }
                else
                {
                    return false;
                }
            }
        }
        return true;
    }
};

交换论证法

证明策略:交换论证法

假设贪心策略的结果是:a b c d e f;最优解是e b c d a f,需要证明在不破坏最优解最优性质的前提下,能够将最优解调整成贪心解。

这里唯一要考虑的就是顾客给20块钱,该如何找零:

  • 贪心策略,有10块和5块,肯定先将10块给出去
  • 最优解,可能是三个5块,也能是5块、10块各一张
    这里需要考虑不一样的情况,即最优解给的三张5块

此时就要看能不能将这种情况替换成贪心策略一模一样的,这里2种情况:

  • 10块钱后面没用上:此时可以直接将最优解的三张5块,换成一张10块和一张5块(因为这个10块钱不影响后续操作)
  • 10块钱有用上:依旧可以替换两张5块钱,两张5块钱后面也能抵一张10块钱

所以,不管是用或者不用,都能将最优解替换成贪心解。

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

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

题目解析

给我们一个正整数数组nums,每次操作都能够从数组选一个数字,对其减半(后续还能继续操作这个数)

最后返回,将nums数组和至少减小一半的最小次数。

算法原理

最少操作次数,每次就挑选最大的,这就是我们的贪心策略。

由于要选择每次最大的元素,这需要用堆来辅助。

最大元素,大根堆。

代码实现

class Solution {
public:
    int halveArray(vector<int>& nums)
    {
        double sum = 0;
        priority_queue<double> heap;
        for(auto e : nums)
        {
            sum += e;
            heap.push(e);
        }
        double targer = sum / 2.0;
        int ret = 0;
        while(sum > targer)
        {
            double n = heap.top();
            heap.pop();
            sum -= n;
            n /= 2.0;
            sum += n;
            ret++;
            heap.push(n);
        }
        return ret;
    }
};

交换论证法

这次还是一样,如果能将最优解不失最优性质的前提下将最优转换为贪心解,就能证明贪心策略是正确的。

image-20240927163356570

由于是贪心策略,到此处的时候x >= y,这里分2种情况:

  • x在最优解当中没有用过,此时x可以直接替换y,y比x小,x减半,效果更足
  • x在最优解后续操作使用过,此时也能替换,因为都是要使用的,先后顺序并没有关系,不会影响操作次数

此时不管怎样,都能进行替换。

179. 最大数

题目链接:179. 最大数

题目解析

给我们一个非负整数数组,让我们排列组合,找出最大的组合。

返回的是字符串,因为这个数字可能非常大。

算法原理

这个排列组合,差不多像排序:

  • 正常排序(升序):
    它的本质就是确定元素的先后顺序,谁在前谁在后
    规则:

    a > ba前 b后
    a = b都行
    a < bb前 a后
  • 本题也是确定元素的先后顺序,即找出排序规则即可

    ab > baa前 b后
    ab = ba都行
    ab < bab前 a后

    这里的贪心就体现在每次比较都确定最好的排序序列

代码实现

class Solution {
public:
    string largestNumber(vector<int>& nums)
    {
        vector<string> str_nums;
        for(auto e : nums)
        {
            str_nums.push_back(to_string(e));
        }

        sort(str_nums.begin(), str_nums.end(), [](const string &s1, const string &s2)
        {
            return s1 + s2 > s2 + s1;
        });

        string ret;
        for(auto e : str_nums)
        {
            ret += e;
        }
        if(ret[0] == '0') return "0";
        return ret;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【一文概述】常见的几种内外网数据交换方案介绍

一、内外网数据交换的核心需求 内外网数据交换的需求核心在于“安全、效率、合规”&#xff0c;而应用场景的多样性使得不同企业需要定制化的解决方案。通过结合业务特性和安全等级要求&#xff0c;企业能够选择适合的技术方案来实现高效、安全的内外网数据交换。 1、数据安全…

C# 中的Task

文章目录 前言一、Task 的基本概念二、创建 Task使用异步方法使用 Task.Run 方法 三、等待 Task 完成使用 await 关键字使用 Task.Wait 方法 四、处理 Task 的异常使用 try-catch 块使用 Task.Exception 属性 五、Task 的延续使用 ContinueWith 方法使用 await 关键字和异步方法…

Scala学习记录

dao --------> 数据访问 mode ------> 模型 service ---->业务逻辑 Main -------> UI:用户直接操作&#xff0c;调用Service 改造UI层&#xff1a;

使用Java得hutool工具实现验证码登录

使用Java的hutool工具实现验证码登录 1.先说一下流程图 2.导入工具包 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.12</version></dependency>3.流程梳理 3.1前端模版代码 …

java中Map接口的实现类

一、介绍 Map接口常用的实现类有HashMap和TreeMap。HashMap是基于哈希表的Map接口的实现&#xff0c;HashMap类实现的Map集合添加和删除映射关系效率更高。HashMap通过哈希码对其内部的映射关系进行快速查找。TreepMap中的映射关系存在一定的顺序&#xff0c;如果希望Map集合中…

讯飞智文丨一键生成WordPPT

在当今数字化办公的浪潮中,Word和PPT已经成为职场人士日常工作的标配工具。然而,面对繁琐的内容编辑和格式调整任务,如何提升效率成了每个人的追求。而讯飞智文,一款结合人工智能技术的文字处理与演示文稿工具,正逐渐成为用户的得力助手。本文将详细介绍讯飞智文的功能特点…

Dot Foods EDI 需求分析及对接流程

Dot Foods 是一家美国领先的食品和非食品产品的中间批发分销商&#xff0c;主要为食品服务、零售和分销行业的客户提供服务&#xff0c;是北美大型食品中间分销商之一。Dot Foods &#xff08;以下简称 Dot&#xff09;的业务模式是通过整合多个供应商的产品&#xff0c;为客户…

感知机及python实现

感知机&#xff08;Perceptron&#xff09;是神经网络的基本构件之一&#xff0c;最初由Frank Rosenblatt在1957年提出。感知机是一种二分类的线性分类器&#xff0c;通过一个简单的线性函数将输入数据分类到两种类别之一。 基本原理 感知机的工作原理如下&#xff1a; 输入&…

信号滤波分析-低通分析(Matlab)

Matlab低通滤波 信号滤波分析-低通分析&#xff08;Matlab&#xff09; 【标价是仅源码的价格】 【有课程设计答辩PPT和设计文档报告】 需要或感兴趣可以随时联系博主哦&#xff0c;常在线秒回&#xff01; 低通滤波分析方案的设计包括&#xff1a; 1.信号生成原理 2.低通滤波…

ChatGPT客户端安装教程(附下载链接)

用惯了各类AI的我们发现每天打开网页还挺不习惯和麻烦&#xff0c;突然发现客户端上架了&#xff0c;懂摸鱼的人都知道这里面的道行有多深&#xff0c;话不多说&#xff0c;开整&#xff01; 以下是ChatGPT客户端的详细安装教程&#xff0c;适用于Windows和Mac系统&#xff1a…

影像组学+病理组学+深度学习人工智能应用

影像组学 基础学习内容&#xff1a; 特征提取&#xff1a;使用pyradiomics进行形状、纹理、小波变换等特征提取。特征筛选&#xff1a;应用ICC、相关系数、mRMR、Lasso等方法。建模&#xff1a;使用LR、SVM、RF、XGBoost、LightGBM等机器学习算法。模型评估&#xff1a;通过A…

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇 2024年的蓝桥杯即将拉开序幕&#xff01;对于许多编程爱好者来说&#xff0c;这不仅是一次展示自我能力的舞台&#xff0c;更是一次学习和成长的机会。作为一名大一新生的小蓝&#xff0c;对蓝桥杯充满了期待&#xff0c;但面对初次参赛的…

Laplace-Beltrami 拉普拉斯-贝尔特拉米算子

Laplace-Beltrami 拉普拉斯-贝尔特拉米算子 Laplace-Beltrami算子是定义在黎曼流形上的一个二阶微分算子&#xff0c;它在微分几何和偏微分方程中都有重要的应用。在计算机图形学和几何处理中&#xff0c;Laplace-Beltrami算子通常用于网格处理&#xff0c;特别是在网格平滑、…

ISP算法之坏点校正DPC(二):Verilog硬件实现与仿真

DPC的算法讲解和MATLAB仿真参考上一节&#xff1a; ISP算法之坏点校正DPC(一)&#xff1a;MATLAB仿真验证-CSDN博客 本节讲解Verilog的硬件实现与仿真 行缓存设计 DPC算法是基于窗口邻域的像素级别算法&#xff0c;因此需要对实时到来的视频流进行行缓存&#xff0c;行缓存…

clearvoice 语音降噪、语音分离库

参看: https://github.com/modelscope/ClearerVoice-Studio/tree/main ClearVoice 提供了一个统一的推理平台,用于语音增强、语音分离以及视听目标说话人提取。 代码参看: https://github.com/modelscope/ClearerVoice-Studio/tree/main/clearvoice https://github.com/mode…

Linux(网络协议和管理)

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…

代理 IP 行业现状与未来趋势分析

随着互联网的飞速发展&#xff0c;代理 IP 行业在近年来逐渐兴起并成为网络技术领域中一个备受关注的细分行业。它在数据采集、网络营销、隐私保护等多个方面发挥着重要作用&#xff0c;其行业现状与未来发展趋势值得深入探讨。 目前&#xff0c;代理 IP 行业呈现出以下几个显著…

[Java] 使用 VSCode 来开发 Java

目录 前言Java 环境怎么看自己是否已经配置完成&#xff1f;安装 JDK安装 Maven 环境修改 Maven 依赖源 完善 VS Code配置插件配置 Maven配置 Maven Settings配置 Maven 可执行文件地址 前言 由于使用 VSCode 编码已经成为习惯&#xff0c;并且它确实相对其他的 IDE 较为轻量化…

【热力学与工程流体力学】流体静力学实验,雷诺实验,沿程阻力实验,丘里流量计流量系数测定,局部阻力系数的测定,稳态平板法测定材料的导热系数λ

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…

基于单片机的无绳跳绳设计

基于单片机设计了一款无绳跳绳&#xff0c;采用传感器代替了绳子的摆动&#xff0c;从而实现了模拟跳绳的功能。其研究的方法是&#xff1a;以单片机作为这次设计的核心&#xff0c;它的外围包含有传感器模块、按键模块、显示模块、语音播报模块及电源模块等。本设计采用STM32芯…