算法日记 26-27day 贪心算法

news2024/11/18 19:44:39

接下来的题目有些地方比较相似。需要注意多个条件。

题目:分发糖果

135. 分发糖果 - 力扣(LeetCode)

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

  • 每个孩子至少分配到 1 个糖果。
  • 相邻两个孩子评分更高的孩子会获得更多的糖果。

请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

题目分析:

        分发糖果需要考虑左右两边的大小,不能同时考虑,会很乱。那么就先考虑一边,在考虑另外一边。

        那么就变成了,从前向后看,比较右孩子大于左孩子的情况和从后往前看,比较左孩子大于右孩子的情况。之所以第二个条件需要从后往前的原因,是因为继续从前往后会不满足题目。

就像这样

所以需要从后往前

代码如下:

public class Solution {
    public int Candy(int[] ratings) {
        int[] res=new int[ratings.Length];
        int candys=0;
        for(int i=0;i<res.Length;i++){
            res[i]=1;//所有孩子最低都是1
        }
        //因为比较需要考虑左右两边的情况,所以需要分开考虑(两个条件)
        for(int i=1;i<ratings.Length;i++){//从前向后看,比较右孩子大于左孩子的情况
            if(ratings[i]>ratings[i-1]){
                res[i]=res[i-1]+1;
            }
        }
        for(int i=ratings.Length-2;i>=0;i--){//从后往前看,比较左孩子大于右孩子的情况
            if(ratings[i]>ratings[i+1]){
                res[i]=Math.Max(res[i],res[i+1]+1);
            }
        }
        for(int i=0;i<res.Length;i++){
            candys+=res[i];
        }
        return candys;
    }
}

 题目:根据身高重建队列

406. 根据身高重建队列 - 力扣(LeetCode)

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

 题目分析:

        同样的需要满足两个条件,那就一个一个的考虑。我们根据身高进行从大到小的排列,身高相同的就根据k进行从小到达的排列。至于为什么这样排,结合题目要求来看

那么代码就很好写出来了

public class Solution {
    public int[][] ReconstructQueue(int[][] people) {
        //需要考虑两个条件,分开考虑
        //先根据身高从大到小排序,这样插入的时候不用考虑K,
        //因为排序之后这个值后面的值一定比他小,在前面插入小的值,自然影响不到他
        Array.Sort(people,(a,b)=>{
            if(a[0]==b[0]){//同样的身高,根据k排序,从小到大
                return a[1]-b[1];
            }
            else return b[0]-a[0];
        });

        var res = new List<int[]>();
        for(int i=0;i<people.Length;i++){//根据k直接插入
            res.Insert(people[i][1],people[i]);
        }
        return res.ToArray();
    }
}

题目:用最少数量的箭引爆气球

452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。

一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstartxend, 且满足  xstart ≤ x ≤ xend,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。

给你一个数组 points ,返回引爆所有气球所必须射出的 最小 弓箭数 

 题目分析:

        根据题目的意思,气球的摆放是有重叠的,如何使用更少的弓箭,自然就是从重叠下手。

就像这样

看看代码理解

public class Solution {
    public int FindMinArrowShots(int[][] points) {
        Array.Sort(points,(a,b)=>a[0].CompareTo(b[0]));
        int res=1;
        for(int i=1;i<points.Length;i++){
            if(points[i][0]>points[i-1][1])//后面气球的起点超过了这个气球的终点,气球不相交
                res++;
            else{//气球重贴了,就把两个气球的范围合起来
                points[i][1]=Math.Min(points[i-1][1],points[i][1]);// 更新重叠气球最小右边界
            }
        }
        return res;
    }
}

题目分析:无重叠区间

435. 无重叠区间 - 力扣(LeetCode)

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 

注意 只在一点上接触的区间是 不重叠的。例如 [1, 2] 和 [2, 3] 是不重叠的。

题目分析:

        和上一题其实差不多的,那么排序的时候我们选择左边界排序还是右边界排序呢?其实都是没有问题的,

        假如我们根据有边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了。

        如果根据左边界排序,就是直接求 重叠的区间,count为记录重叠区间数

public class Solution {
    public int EraseOverlapIntervals(int[][] intervals) {
        if (intervals.Length == 0) return 0;
        Array.Sort(intervals, (a, b) => a[1].CompareTo(b[1]));
        int res = 1, end = intervals[0][1];
        for (int i = 1; i < intervals.Length; i++)
        {
            if (end <= intervals[i][0])
            {
                end = intervals[i][1];
                res++;
            }
        }
        return intervals.Length - res;
    }
}

题目:划分字母区间

763. 划分字母区间 - 力扣(LeetCode)

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。

返回一个表示每个字符串片段的长度的列表。

题目分析:

        这一题可以使用hash去统计字符的位置,但是这样很容易超时。

        在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。

可以分为如下两步:

  • 统计每一个字符最后出现的位置
  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点

 

代码如下:

public class Solution {
    public IList<int> PartitionLabels(string s) {
        int[] location = new int[27];
        for (int i = 0; i < s.Length; i++)//记录每个元素出现的最远位置
        {
            location[s[i] - 'a'] = i;
        }
        List<int> res = new List<int>();
        int left = 0, right = 0;
        for (int i = 0; i < s.Length; i++)
        {
            right = Math.Max(right, location[s[i] - 'a']);//更新这个区间的最远位置
            if (i == right)//到达最远位置,划分
            {
                res.Add(right - left + 1);
                left = i + 1;
            }
        }
        return res;
    }
}

题目:合并区间

56. 合并区间 - 力扣(LeetCode)

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

题目分析:

        和之前的题目差不多 ,排序之后比较

public class Solution {
    public int[][] Merge(int[][] intervals) {
        if (intervals.Length == 0)
            return intervals;
        Array.Sort(intervals,(a,b)=>{
            return a[0]-b[0];//从小到大排列
        });
        List<List<int>> res = new List<List<int>>();
        res.Add(intervals[0].ToList());
        for(int i=1;i<intervals.Length;i++){
            if(intervals[i][0]<=res[res.Count-1][1]){//和结果中最后一个区间重贴
                res[res.Count-1][1]=Math.Max(intervals[i][1],res[res.Count-1][1]);
            }
            else{
                res.Add(intervals[i].ToList());
            }
        }
        return res.Select(x => x.ToArray()).ToArray();
    }
}

题目:单调递增的数字

738. 单调递增的数字 - 力扣(LeetCode)

当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。

题目分析:

        暴力解放比较简单,对每一个数进行判断,当然肯定会超时。看看贪心的思路,例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。

        此时是从前向后遍历还是从后向前遍历呢?

        从前向后遍历的话,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能又小于strNum[i - 2]。

所以选择从后向前遍历。

public class Solution {
    public int MonotoneIncreasingDigits(int n) {
        char[] temp=n.ToString().ToCharArray();
        int flag=temp.Length;//记录那些位置需要改变
        for(int i=temp.Length-1;i>0;i--){
            if(temp[i-1]>temp[i]){
                flag=i;
                temp[i-1]--;
            }
        }
        for(int i=flag;i<temp.Length;i++){
            temp[i]='9';
        }
        return int.Parse(new string(temp));
    }
}

对于更详细的解析与其他语言的代码块,可以去代码随想录上查看。

代码随想录 (programmercarl.com)

已刷题目:86

 

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

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

相关文章

编写一个生成凯撒密码的程序

plain list(input("请输入需要加密的明文&#xff08;只支持英文字母&#xff09;&#xff1a;"))key int(input("请输入移动的位数&#xff1a;"))base_A ord(A)base_a ord(a)cipher []for each in plain:if each :cipher.append( )else:if each.i…

PyCharm2024.2.4安装

一、官网下载 1.从下面的链接点进去 PyCharm: The Python IDE for data science and web development by JetBrains 2.进入官网后&#xff0c;下载pycharm安装包 3.点击下载能适配你系统的安装包 4.安装包下载完成 二、安装 1.下载完成后&#xff0c;打开点击右键&#xff…

【MySQL】MySQL数据库入门:构建你的数据基石

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;MySQL初阶探索&#xff1a;构建数据库基础 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f985;数据库基础&#x1f400;什么是数据库&#x1f40f;主流数据库&#x1f986;MySQL数据库的基本…

基于Python 和 pyecharts 制作招聘数据可视化分析大屏

在本教程中&#xff0c;我们将展示如何使用 Python 和 pyecharts 库&#xff0c;通过对招聘数据的分析&#xff0c;制作一个交互式的招聘数据分析大屏。此大屏将通过不同类型的图表&#xff08;如柱状图、饼图、词云图等&#xff09;展示招聘行业、职位要求、薪资分布等信息。 …

OMV7 树莓派 tf卡安装

​ 升级7之后&#xff0c;问题多多&#xff0c;不是docker不行了&#xff0c;就是代理不好使 今天又重装了一遍&#xff0c;用官方的链接&#xff0c;重新再折腾一遍…… 使用raspberry pi imager安装最新版lite OS。 注意是无桌面 Lite版 配置好树莓派初始化设置&#xff0…

idea 弹窗 delete remote branch origin/develop-deploy

想删除远程分支&#xff0c;就选delete&#xff0c;仅想删除本地分支&#xff0c;选cancel&#xff1b; 在 IntelliJ IDEA 中遇到弹窗提示删除远程分支 origin/develop-deploy&#xff0c;这通常是在 Git 操作过程中出现的情况&#xff0c;可能是在执行如 git branch -d 或其他…

GitCode光引计划有奖征文大赛

一、活动介绍 GitCode平台汇聚了众多杰出的G-Star项目&#xff0c;它们犹如璀璨星辰&#xff0c;用各自的故事和成就&#xff0c;为后来者照亮前行的道路。我们诚邀广大开发者、项目维护者及爱好者&#xff0c;共同撰写并分享项目在GitCode平台上托管的体验&#xff0c;挖掘平…

qt移植到讯为rk3568,包含一些错误总结

qt移植到arm报错动态库找不到 error while loading shared libraries: libAlterManager.so.1: cannot open shared object file: No such file or directory 通过设置环境变量 LD_LIBRARY_PATH就行了。 LD_LIBRARY_PATH是一个用于指定动态链接器在运行时搜索共享库的路径的环…

Android Framework AMS(16)进程管理

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要解读AMS 进程方面的知识。关注思维导图中左上侧部分即可。 我们本章节主要是对Android进程管理相关知识有一个基本的了解。先来了解下L…

(一)- DRM架构

一&#xff0c;DRM简介 linux内核中包含两类图形显示设备驱动框架&#xff1a; FB设备&#xff1a;Framebuffer图形显示框架; DRM&#xff1a;直接渲染管理器&#xff08;Direct Rendering Manager&#xff09;&#xff0c;是linux目前主流的图形显示框架&#xff1b; 1&am…

【PHP】ThinkPHP基础

下载composer ComposerA Dependency Manager for PHPhttps://getcomposer.org/ 安装composer 查看composer是否安装 composer composer --version 安装 ThinkPHP6 如果你是第一次安装的话&#xff0c;首次安装咱们需要打开控制台&#xff1a; 进入后再通过命令,在命令行下面&a…

Elasticsearch基本概念及使用

Elasticsearch 是一个开源的、分布式的全文搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它提供了快速的搜索能力&#xff0c;支持大规模的数据分析&#xff0c;广泛应用于日志分析、全文搜索、监控系统和商业智能等领域。ES操作指令是基于restAPI构建&#xff0c;也就…

黑马智慧商城项目学习笔记

目录 智慧商城项目创建项目调整初始化目录vant组件库vant按需导入和全部导入 项目中的vw适配路由设计配置登录页静态布局图形验证码功能request模块-axios封装api模块-封装图片验证码接口 Toast轻提示&#xff08;vant组件&#xff09;短信验证倒计时功能登录功能响应拦截器统一…

攻防世界Web-bug

打开链接 先注册一个账号 创建成功&#xff0c;会给一个UID5 抓包的user值就是UID:用户名的md5加密的编码 点击Manage时要求admin用户 利用改包把user改成admin 1:admin的md5值为4b9987ccafacb8d8fc08d22bbca797ba 还要把url上的UID改为1 存在逻辑漏洞&#xff0c;成功越权 …

apk反编译修改教程系列-----apk应用反编译中AndroidManifest.xml详细代码释义解析 包含各种权限 代码含义【二】

💝💝💝💝在上期博文中解析了一个常规apk中 AndroidManifest.xml的权限以及代码。应粉丝需求。这次解析一个权限较高的apk。这款apk是一个家长管控的应用。需求的各种权限较高。而且通过管控端可以设置控制端的app隐藏与否。 通过博文了解💝💝💝💝 1💝💝…

湘潭大学软件工程算法设计与分析考试复习笔记(一)

文章目录 前言随机类&#xff08;第七章&#xff09;随机概述数值随机化舍伍德拉斯维加斯蒙特卡罗 模拟退火遗传人工神经网络 回溯&#xff08;第五章&#xff09;动态规划&#xff08;第四章&#xff09;后记 前言 考试还剩十一天&#xff0c;现在准备开始复习这门课了。好像全…

如何使用正则表达式验证域名

下面是一篇关于如何使用正则表达式验证域名的教程。 如何使用正则表达式验证域名 简介 域名是互联网上网站的地址&#xff0c;每个域名由多个标签&#xff08;label&#xff09;组成&#xff0c;标签之间用点 . 分隔。域名规则有很多细节&#xff0c;但基本要求是&#xff1a…

【Cesium】自定义材质,添加带有方向的滚动路线

【Cesium】自定义材质&#xff0c;添加带有方向的滚动路线 &#x1f356; 前言&#x1f3b6;一、实现过程✨二、代码展示&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 【Cesium】自定义材质&#xff0c;添加带有方向的滚动路线 &#x1f3b6;一、…

DDoS高防服务器:保障业务安全和稳定的抗攻击利器

摘要 随着网络攻击愈发频繁&#xff0c;尤其是DDoS&#xff08;分布式拒绝服务&#xff09;攻击的威胁不断增长&#xff0c;DDoS高防服务器成为保护企业网络安全的重要工具。本文将详细介绍DDoS高防服务器的原理、优势、应用场景及选择要点&#xff0c;帮助企业有效应对攻击&am…

vim配置 --> 在创建的普通用户下

在目录/etc/ 下面&#xff0c;有个名为vimrc 的文件&#xff0c;这是系统中公共的vim配置文件对所有用户都有效 我们现在创建一个普通用户 dm 创建好以后&#xff0c;我们退出重新链接 再切换到普通用户下 再输入密码&#xff08;是不显示的&#xff0c;输入完后&#xff0c;…