代码随想录训练营26day-贪心算法4

一、860 柠檬水找零

题目解析:注意一开始是没有零钱,也只会取5 10 20三类数字,因此从这3类数字出发,去判断。

1 如果是5元,那么直接收,five++;

2 如果是10元,那么需要five--,ten++,但是如果five本身就小于0,那么不可能找零成功,返回false;

3 如果是20元,这里需要看有多少种零钱找零方式:1)10元+5元组合; 2)5+5+5组合;首先需要消耗10元,因为5元可以兑换零钱方式更多,先把兑换方式少的减掉。

bool lemonadeChange(int* bills, int billsSize) {
    int five = 0, ten = 0, twenty = 0;

    for(int i = 0; i < billsSize; i++)
    {
        if(bills[i] == 5)
        {
            five++;
        }
        else if(bills[i] == 10)
        {
            ten++;
            if(five > 0)
            {
                five--;
            }
            else
            {
                //five没有 无法找零
                return false;
            }
        }
        else
        {
            if(ten > 0 && five > 0)
            {
                ten--;
                five--;
            }
            else if(five >= 3)
            {
                five -=3;
            }
            else
            {
                return false;
            }
        }

    }

    return true;
}

二、406 根据身高重建队列

题目要求重建队列,保证身高和前面的人数两个方面,需要从两个方面去拆分排序。

1 先考虑身高,从高到低,如果身高相同,那么k(人数)少的排前面。

2 排序k(人数)因为身高已经排序成功,所以需要考虑的是k值,把k插入对应的位置,这样people身高是排序的,只需要考虑k的位置,就满足了两个条件。

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
void insert(int**arr, int size, int pos, int* val)
{
    int** tmp = (int**)malloc(sizeof(int*) * size);
    
    int index = 0;
    for(int i = pos; i < size; i++)
    {
        tmp[index] = malloc(sizeof(int) * 2);
        tmp[index][0] = arr[i][0];
        tmp[index][1] = arr[i][1];
        index++;
    }
    //改值
    arr[pos][0] = val[0];
    arr[pos][1] = val[1];
    index = 0;
    for(int i = pos + 1; i < size; i++)
    {
        arr[i][0] = tmp[index][0];
        arr[i][1] = tmp[index][1];
        index++;
    }

    // for(int i = 0; i < size; i++)
    // {
    //     printf("val = %d %d\n", arr[i][0], arr[i][1]);
    // }
}
void swap(int* a, int* b)
{
    int tmp_1 = a[0];
    int tmp_2 = a[1];

    a[0] = b[0];
    a[1] = b[1];

    b[0] = tmp_1;
    b[1] = tmp_2;
}
int** reconstructQueue(int** people, int peopleSize, int* peopleColSize, int* returnSize, int** returnColumnSizes) {
    *returnSize = peopleSize;
    *returnColumnSizes = (int*)malloc(peopleSize * sizeof(int));
    //先排列身高
    for(int i = 0; i < peopleSize - 1; i++)
    {
        for(int j = i + 1; j < peopleSize; j++)
        {
            if(people[j][0] == people[i][0])
            {
                if(people[j][1] < people[i][1])
                {
                    // int tmp_1 = people[j][0];
                    // int tmp_2 = people[j][1];

                    // people[j][0] = people[i][0];
                    // people[j][1] = people[i][1];
        
                    // people[i][0] = tmp_1;
                    // people[i][1] = tmp_2;
                    swap(people[j], people[i]);
                }
            }
            else if(people[j][0] > people[i][0])
            {
                // int tmp_1 = people[j][0];
                // int tmp_2 = people[j][1];

                // people[j][0] = people[i][0];
                // people[j][1] = people[i][1];
    
                // people[i][0] = tmp_1;
                // people[i][1] = tmp_2;
                swap(people[j], people[i]);
            }
        }
    }

    //再查看 k值
    int** queue = (int**)malloc(sizeof(int*) * peopleSize);

    for(int i = 0; i < peopleSize; i++)
    {
       queue[i] = (int*)malloc(sizeof(int) * 2);
       queue[i][0] = people[i][0];
       queue[i][1] = people[i][1];
    }

    for(int i = 0; i < peopleSize; i++)
    {
        (*returnColumnSizes)[i] = 2;
        //printf("%d -> pepeple %d %d\n", i, people[i][0], people[i][1]);
        insert(queue, peopleSize, people[i][1], people[i]);
    }

    return queue;
}

三、452. 用最少数量的箭引爆气球

题目分析:用最少的箭引爆气球,主要是考虑重叠情况,如果重叠区间越多,那么使用的箭数量越少,利用排序 + 贪心算法:

void swap(int* a, int* b)
{
    int tmp_1 = a[0];
    int tmp_2 = a[1];

    a[0] = b[0];
    a[1] = b[1];

    b[0] = tmp_1;
    b[1] = tmp_2;
}

int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){
    *pointsColSize = 2;
    if(pointsSize == 0)
    {
        return 0;
    }
    int result = 1;
    //按照左边界排序
    for(int i = 0; i < pointsSize - 1; i++)
    {
        for(int j = i + 1; j < pointsSize; j++)
        {
            if(points[j][0] < points[i][0])
            {
               swap(points[i], points[j]);
            }
        } 
    }
 
    for(int i = 1; i < pointsSize; i++)
    {
        if(points[i][0] > points[i -1][1])
        {
            result++;
        }
        else
        {
            points[i][1] = points[i][1] < points[i -1][1]? points[i][1] : points[i - 1][1];//最小右边界
        }
    }
    return result;
}

上面的code在LeetCode上面会超时,分析了下,应该是排序算法导致的,因此参考快排的算法:

void swap(int* a, int* b)
{
    int tmp_1 = a[0];
    int tmp_2 = a[1];

    a[0] = b[0];
    a[1] = b[1];

    b[0] = tmp_1;
    b[1] = tmp_2;
}
int Partition(int **points, int low, int high){     // 从小到大排序
    int base = points[low][0];
    int index = points[low][1];
    int left,right;
    while(low < high){
        while(low < high && points[high][0] >= base){
            high--;
        }
        left = points[low][0];
        right = points[low][1];
        points[low][0] = points[high][0];
        points[low][1] = points[high][1];
        points[high][0] = left;
        points[high][1] = right;        
        while(low < high && points[low][0] <= base){
            low++;
        }
        left = points[low][0];
        right = points[low][1];
        points[low][0] = points[high][0];
        points[low][1] = points[high][1];
        points[high][0] = left;
        points[high][1] = right;
    }
    return low;
}
void QuickSort(int **points, int low, int high){
    if(low < high){
        int base = Partition(points,low,high);
        QuickSort(points,low,base - 1);
        QuickSort(points, base + 1, high);
    }
}

int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){
    *pointsColSize = 2;
    if(pointsSize == 0)
    {
        return 0;
    }
    int result = 1;
    //按照左边界排序
    // for(int i = 0; i < pointsSize - 1; i++)
    // {
    //     for(int j = i + 1; j < pointsSize; j++)
    //     {
    //         if(points[j][0] < points[i][0])
    //         {
    //            swap(points[i], points[j]);
    //         }
    //     } 
    // }
    QuickSort(points, 0 , pointsSize - 1);//左闭右闭区间
    for(int i = 1; i < pointsSize; i++)
    {
        if(points[i][0] > points[i -1][1])//如果当前的左边超过了上一个的右边边界,不重叠
        {
            result++;
        }
        else//找到重叠区间最小右边界
        {
            points[i][1] = points[i][1] < points[i -1][1]? points[i][1] : points[i - 1][1];//最小右边界
        }
    }
    return result;
}

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

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

相关文章

(Oracle)SQL优化案例:组合索引优化

项目场景 项目上的ETL模型里有如下SQL语句。执行速度非常慢&#xff0c;每次只查询200条数据&#xff0c;但却需要20多秒的时间。再加上该SQL查询出的数据同步频率很高&#xff0c;这个速度是完全不能忍受的。 因为项目隐私&#xff0c;所以对表及字段做了改写。 SELECT ID…

SVN小乌龟汉化问题

1.首先确认中文语言包和SVN版本需要一致&#xff08;点击右键 选择最后一个选项即可查看&#xff09; 官网链接 点击这个官网链接可以下载对应版本的中文包 2.下载好之后直接无脑下一步安装即可 3.如果还是没有中文&#xff0c;找到这个文件夹&#xff0c;把里面的内容全部删…

SpaceX的核心Fact Sheet

首先给大家分享一组SpaceX的关键数据&#xff0c;让大家对这个神秘公司有个定量认知&#xff1a; 2024年SpaceX预计收入可达130亿美金&#xff0c;同比增长54%&#xff0c;预计2035年可达1000亿美金 SpaceX目前已经处于盈利状态&#xff0c;具体利润规模未知 SpaceX的发射成本…

Kotlin语法入门-类与对象(6)

Kotlin语法入门-类与对象(6) 文章目录 Kotlin语法入门-类与对象(6)六、类与对象1、声明和调用2、get和set3、init函数初始化4、constructor构造函数4.1、主构造函数4.2、二级构造函数4.3、多个构造函数4.4、省略主构造函数并写了次构造函数 5、类的继承与重写5.1、继承5.2、继承…

每天五分钟计算机视觉:基于YOLO算法精确分类定位图片中的对象

滑动窗口的卷积的问题 滑动窗口的卷积实现效率很高,但是它依然不能够输出最精准的边界框,比如下面所示: 我们可以看到蓝色框不论在什么位置都不能很好的确定车的位置,有一个算法是YOLO 算法它能够帮助我们解决这个问题。 YOLO 算法 比如我们的输入图像是100*100,我们会…

TCP相关问题总结

文章目录 TCP连接建立过程1. TCP三次握手2. TCP四次挥手3. TCP为什么是三次握手4. TCP为什么是四次挥手 TCP流量控制TCP拥塞控制1. 为什么需要拥塞控制2. 控制手段 TCP连接建立过程中出现丢包 TCP连接建立过程 1. TCP三次握手 首先client端发出连接请求&#xff0c;并且请求同…

在 VSCode 中运行 C#

文章目录 1.为何选择VSCode而不是VS2.操作步骤2.1 安装.NET2.2 安装扩展插件2.2.1 C#2.2.2 Code Runner 3.新建工程HelloCsharp 1.为何选择VSCode而不是VS VS实在是太“重”了&#xff0c;如果只是写一些简单控制台程序进行调试&#xff0c;则完全没必要 2.操作步骤 2.1 安装…

线性代数 --- 矩阵的对角化以及矩阵的n次幂

矩阵的对角化以及矩阵的n次幂 &#xff08;特征向量与特征值的应用&#xff09; 前言&#xff1a; 在上一篇文章中&#xff0c;我记录了学习矩阵的特征向量和特征值的学习笔记&#xff0c;所关注的是那些矩阵A作用于向量x后&#xff0c;方向不发生改变的x(仅有尺度的缩放)。线…

iOS - 多线程-GCD-队列组

文章目录 iOS - 多线程-GCD-队列组1. 队列组1.1 基本使用步骤 iOS - 多线程-GCD-队列组 开发过程中&#xff0c;有时候想实现这样的效果 多个任务并发执行所有任务执行完成后&#xff0c;进行下一步处理&#xff08;比如回到主线程刷新UI&#xff09; 1. 队列组 可以使用GC…

探索亚马逊云科技「生成式 AI 精英速成计划」

目录 前言「生成式 AI 精英速成计划」技术开发课程学习课程学习 总结 前言 亚马逊云科技&#xff08;Amazon Web Services&#xff0c;简称AWS&#xff09;作为全球领先的云计算服务提供商&#xff0c;一直以来在推动人工智能&#xff08;AI&#xff09;领域的发展中扮演着重要…

调度问题变形的贪心算法分析与实现

调度问题变形的贪心算法分析与实现 一、问题背景与算法描述二、算法正确性证明三、算法实现与分析四、结论 一、问题背景与算法描述 带截止时间和惩罚的单位时间任务调度问题是一个典型的贪心算法应用场景。该问题的目标是最小化超过截止时间导致的惩罚总和。给定一组单位时间…

element plus:tree拖动节点交换位置和改变层级

图层list里有各种组件&#xff0c;用element plus的tree来渲染&#xff0c;可以把图片等组件到面板里&#xff0c;面板是容器&#xff0c;非容器组件&#xff0c;比如图片、文本等&#xff0c;就不能让其他组件拖进来。 主要在于allow-drop属性的回调函数编写&#xff0c;要理清…

毕业撒花 流感服务小程序的设计与实现

目录 1.1 总体页面设计 1.1.1 用户首页 1.1.2 新闻页面 1.1.3 我的页面 1.1.5 管理员登陆页面 1.1.6 管理员首页 1.2 用户模块 1.2.1 体检预约功能 1.2.2 体检报告功能 1.2.4 流感数据可视化功能 1.2.5 知识科普功能 1.2.6 疾病判断功能 1.2.7 出示个人就诊码功能 …

java实现解析html获取图片或视频url

一、前言 有时在实际项目中&#xff0c;比如发布某篇文章&#xff0c;需要取文章中的某张图片作为封面&#xff0c;那么此时需要文章内容&#xff0c;获取html内容中的图片地址作为封面&#xff0c;下面讲下如何获取html中的图片或视频地址。 二、实现 1.先定义一个工具类&…

Elasticsearch集群部署(Linux)

1. 准备环境 这里准备三台Linux虚拟机&#xff0c;用于配置Elasticsearch集群和部署可视化工具Kibana。 角色IP域名集群名称节点名称版本操作系统ES192.168.243.100linux100cluster-eses-node-1007.12.0CentOS 7192.168.243.101linux101cluster-eses-node-101192.168.243.102…

IDEA 常规设置,让工作便利化

1、自动提示&#xff0c;不区分大小写 File-->Settings-->Editor-->Code completion 然后把Match Case前面的勾选去掉&#xff0c;点击OK保存 2.快速生成main方法设置 idea快速生成main方法的快捷键是psvm (public static void main(String[] args) {}) &#xff1b;…

C语言入门课程学习笔记1

C语言入门课程学习笔记1 第1课 - 概论第2课 -helloworld第3课 -数据输出第4课 -数据类型与变量第5课 - 深入数据类型与变量第6课 - 类型与变量编程练习第7课 - 程序中的数据输入 本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程&#xff0c;图片全部来源于课程PPT&#xff…

分割链表和回文链表习题

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 个人主页&#xff1a;LaNzikinh-CSDN博客 收入专栏:初阶数据结构_LaNzikinh篮子的博客-CSDN博客 文章目录 一.回文链表LCR 027. 回文链表 - 力扣&#x…

BUUCTF---[SWPU2019]神奇的二维码

1、下载附件是一张二维码&#xff0c;拿去扫描得到了flag 2、拿去提交是错的&#xff08;不会这么简单哈哈哈&#xff09;&#xff0c;常规操作在kali中分析 3、分离发现图片里面有东西 4、查看txt&#xff0c;发现里面有一串字符&#xff0c;解码后为 5、查看文档&#xff0c…

比特币之路:技术突破、创新思维与领军人物

比特币的兴起是一段充满技术突破、创新思维和领军人物的传奇之路。在这篇文章中&#xff0c;我们将探讨比特币发展的历程&#xff0c;以及那些在这一过程中发挥重要作用的关键人物。 技术突破与前奏 比特币的诞生并非凭空而来&#xff0c;而是建立在先前的技术储备之上。在密码…
最新文章