算法通过村第十七关-贪心|白银笔记|贪心高频问题

文章目录

  • 前言
  • 区间问题
    • 判断区间是否重复
    • 合并区间
    • 插入区间
  • 字符串分割
  • 加油站问题
  • 总结


前言


提示:如果生活把你的门关上了,那你就再打开,这就是门,门就是这样的。 --佚名

贪婪的思想不一定要理解的很透彻,但是贪婪的问题我们要掌握的很好,这里我们就研究一些高频的考察题目。

区间问题

区间问题就是典型的面试中常见到的,这类面试题还是很受欢迎的,容易考察应聘者到底会不会写好代码。我们看看一些区间的例子🌰.两个区间的所有可能关系如下所示:

对于所有区间的问题,我们还是看看下面的图,一定要记住这些关系,很常见,也很容易出。

在这里插入图片描述

判断区间是否重复

参考地址连接:【leetcode】252 会议室(数组)_给定一个会议时间安排的数组-CSDN博客

在这里插入图片描述
看下图🥰:
在这里插入图片描述
因为一个人同一时刻只能参加一个会议,因此题目实质是判断是否存在重叠区间的。将区间按照会议开始时间进行排序,然后遍历一遍判断后面的会议开始的时候是否前面的会议还没有结束即可,也就是上面的图中所显示的,如果存在重叠直接返回false即可。

    /*** 会议室(数组)** @param intervals* @return*/public static boolean canAttendMeetings(int[][] intervals) {//将区间排序Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);// 遍历所有会议,是否出现重复 ( 技巧 从1 开始for (int i = 1; i < intervals.length; i++) {if (intervals[i][0] < intervals[i - 1][1]) {return false;}}return true;}

合并区间

参考题目参数:56. 合并区间 - 力扣(LeetCode)

在这里插入图片描述
在这里插入图片描述
看下图🥰:
在这里插入图片描述
和上一题一样,首先对区间按照起点端点进行升序排序,然后逐个判断当前区间是否与前一个区间重叠,如果不重叠的话直接加入结果集,反之重叠的话(当前区间与前一个区间进行合并)

 /*** 合并区间* @param intervals* @return*/public static int[][] merge(int[][] intervals) {// 排序数组Arrays.sort(intervals,(v1,v2) ->v1[0] - v2[0]);// 创建新的区间int[][] merge = new int[intervals.length][2];int idx = -1;// 遍历数组for(int [] interval: intervals){// 如果数组是空的或者当前区间的起始位置 > 结果数组中最后区间的最大值// 不合并区间,直接加入区间if (idx == -1 && interval[0] > merge[idx][1]){merge[++idx] = interval;}else{// 反之说明重叠,则将当前区间合并至结果数组的最后区间merge[idx][1] = Math.max(merge[idx][1],interval[1]);}}return Arrays.copyOf(merge, idx + 1);}

插入区间

参考题目地址:57. 插入区间 - 力扣(LeetCode)

在这里插入图片描述
本题目也是上一个题目的扩展,这里区间已经按照起始结束升序排列了,我们可以直接遍历区间,寻找新区间的插入位置就可以了。

  1. 首先经新新区间左边且相离的区间加入结果集(遍历时,如果当前区间的结束位置,小于新区见的开始位置,说明当前区间在新区间的左边且相离)。
  2. 接着判断当前区间是否与新区间重叠,重叠的话就进行合并,知道遍历到当前区间在新区间的右边且相离,将最终合并后的新区间加入结果集;
  3. 最后将结果集右边且相离的区间加入结果集。
    /*** 插入区间* @param intervals* @param newInterval* @return*/public static int[][] insert(int[][] intervals, int[] newInterval) {// 创建一个足够大的数组int[][] res = new int[intervals.length + 1][2];int idx = 0;// 左边的先进入(intervals[i][1] < newInterval[0]//(后面还用的到int i = 0;while(i < intervals.length && intervals[i][1] < newInterval[0] ){res[++idx] = intervals[i++];}// 合并新区间while(i < intervals.length && intervals[i][0] <= newInterval[1]){// 最左端newInterval[0] = Math.min(newInterval[0], intervals[i][0]);// 最右端newInterval[1] = Math.min(newInterval[1],intervals[i][0]);i++;}// 将合并的区间放入结果集res[idx++]= newInterval;// 放入右边的,直接放入结果集while(i < intervals.length){res[idx++]= intervals[i++];}return Arrays.copyOf(res,idx);}

字符串分割

参考题目地址:763. Partition Labels - 力扣(LeetCode)

在这里插入图片描述

在这里插入图片描述
这个问题,有点回溯。分割问题是回溯算法的典型应用,但是这个问题如果用回溯将很复杂。题目要求同一个字母最多出现在一个片段中,那么要如何进行分片才算合理呢?🤔

该遍历过程相当于找每个字母的边界,如果知道之前遍历过的所有字母的最远边界,说明这个边界就是分割点了,此时前面出现的所有字母,最远也就到这个边界,所以做如下操作:

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

在这里插入图片描述

直接上代码:这个太神了

   /*** 划分字母区间** @param S* @return*/public static List<Integer> partitionLabels(String S) {List<Integer> res = new ArrayList<Integer>();int[] edge = new int[26];char[] chars = S.toCharArray();for (int i = 0; i < chars.length; i++) {// 只保留最后一次的位置edge[chars[i] - 'a'] = i;}int idx = 0;int last = -1;for (int i = 0; i < chars.length; i++) {idx = Math.max(idx, edge[chars[i] - 'a']);if (i == idx) {// 这个非常巧妙res.add(i - last);last = i;}}return res;}

加油站问题

参考题目介绍:134. 加油站 - 力扣(LeetCode)

在这里插入图片描述
在这里插入图片描述

我们说做贪婪的题目,如果不管什么是贪婪,就直接做题。这里解释以下题目的含义:

实例给我们了两个数组,知识代表了当前站提供的油料,以及从前一个站过来需要消耗多少油料,因为是环,所以这里gas[0] = 1 和gas[0] = 3 就表示第一个站有1升汽油,从第一个站到第二个站需要消耗3升汽油.

当然最简单的方式是暴力从第一个试到最后一个。如图:

在这里插入图片描述
我们一直向后找,可以的话是一定有答案的。

但是,这个问题需要大量的重复计算,优化以下:

  1. 首先,如果总的油量大于(等于)总的消耗量,那么是可以跑完一圈的,具体就每段我们要考虑以下了。在具体一点是各个站的剩余油量rest[i]相加一点是大于等于零的。
  2. 每个加油站的剩余量rest[i]为gas[i] - cost[i].从i到0开始累加rest[i],和基座curSum,一旦curSum小于零,说明[0,i]区间都不能做起始位置,起始位置必须从i + 1开始重新算,只有这样才能保证我们有可能完成。
    在这里插入图片描述
    代码展示:
  public int canCompleteCircuit(int[] gas, int[] cost) {int start = 0;int totalSum = 0;int curSum = 0;for(int i = 0; i < gas.length; i++){curSum += gas[i] - cost[i];totalSum += gas[i] - cost[i];if(curSum < 0){// 更新起始位置start = i + 1;// 更新curSumcurSum = 0;}}// 说明不能走一圈if(totalSum < 0){return -1;}return start;}

总结

提示:区间问题;字符串分割;加油站;贪婪算法;区间划分


如果有帮助到你,请给题解点个赞和收藏,让更多的人看到 ~ ("▔□▔)/

如有不理解的地方,欢迎你在评论区给我留言,我都会逐一回复 ~

也欢迎你 关注我 ,喜欢交朋友,喜欢一起探讨问题。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苍穹外卖-day03

苍穹外卖-day03 课程内容 公共字段自动填充新增菜品菜品分页查询删除菜品修改菜品 **功能实现&#xff1a;**菜品管理 菜品管理效果图&#xff1a; 1. 公共字段自动填充 1.1 问题分析 在上一章节我们已经完成了后台系统的员工管理功能和菜品分类功能的开发&#xff0c;在…

成都无人机测绘公司 无人机测绘服务 无人机航测作业

无人机测绘是传统航空摄影测量方式的重要补充方式&#xff0c;它具有灵活、高效、适用范围广、生产周期短等优势&#xff0c;在小区域和飞行困难地区获取高分辨率图像具有明显的优势。目前&#xff0c;无人机测绘主要应用于土地监管、灾害应急处理、城市规划管理等方面。那么&a…

uniapp开发app,在ios真机上出现的css样式问题

比如下面的问题&#xff0c;在iphone 13上出现&#xff0c;在iphone xR上正常。 问题一&#xff1a;border:1rpx造成边框显示不全 在iphone13上border边框有一部分不显示&#xff1a; 在iphone xR上显示正常&#xff1a; 解决办法是&#xff1a; 将border边框设置中的1rpx改…

html2pdf

页面布局时将需要保存在同一页pdf的dom元素用div包裹&#xff0c;并为该div添加class类名&#xff0c;例如.convertPDF&#xff0c;如果有多页创建多个.convertPDF这个div&#xff0c;再循环保存pdf即可 用到了html2canvas和JsPdf这两个插件&#xff0c;自行站内搜索安装

drawio特性

drawio的特性 drawio是领先的基于Web技术的草图和图表功能功能的应用。 保证数据的安全 集成了各种不同的平台&#xff0c;和提供了在线的免费编辑器&#xff0c;可以使用app.diagrams.net来方案&#xff0c;drawio本身不会存储用户的数据。 随着互联网时代的发展&#xff0…

CVE-2021-44228 Apache log4j 远程命令执行漏洞

一、漏洞原理 log4j(log for java)是由Java编写的可靠、灵活的日志框架&#xff0c;是Apache旗下的一个开源项目&#xff0c;使用Log4j&#xff0c;我们更加方便的记录了日志信息&#xff0c;它不但能控制日志输出的目的地&#xff0c;也能控制日志输出的内容格式&#xff1b;…

走进国产机器人领军品牌华数机器人,共探数字化变革魔力

近日&#xff0c;纷享销客举办的“一院两司服务对接会暨走进纷享销客【数字化标杆】游学示范基地活动”在佛山顺利举行&#xff0c;本期活动走进华中数控旗下品牌、国家级专精特新“小巨人”企业华数机器人&#xff0c;特邀佛山华数机器人有限公司常务副总经理杨林、纷享销客广…

Go语言入门心法(十五):Go微服务实战

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(七): 并发与通道 Go语言入门心法(八): mysql驱动安装报错o…

Nginx 的配置文件(负载均衡,反向代理)

Nginx可以配置代理多台服务器&#xff0c;当一台服务器宕机之后&#xff0c;仍能保持系统可用。 cmd查找端口是否使用&#xff1a;netstat -ano Nginx出现403 forbidden #解决办法&#xff1a;修改web目录的读写权限&#xff0c;或者是把nginx的启动用户改成目录的所属用户&…

IOC课程整理-13 Spring校验

1. Spring 校验使用场景 2. Validator 接口设计 3. Errors 接口设计 4. Errors 文案来源 5. 自定义 Validator 6. Validator 的救赎 7. 面试题精选 Spring 校验接口是哪个 org.springframework.validation.Validator Spring 有哪些校验核心组件&#xff1f;

ThinkPad电脑HDMI接口失灵如何解决?

ThinkPad电脑HDMI接口失灵如何解决&#xff1f; 如果平时正常使用的外接显示器&#xff0c;某天突然无法使用了&#xff0c;重新插拔依然无信号的话&#xff0c;可以打开系统的设备管理器&#xff08;快捷键winx&#xff09;&#xff0c;首先看一下监视器的识别情况&#xff0c…

基于RK3568高性价比全国产EMS储能解决方案(二)设计方案

目录 版 本 修 订 记 录 1. 产品介绍 1.1. 什么是XM3568-EP 1.2. 产品特点 1.3. 外壳尺寸 1.4. 外壳外观 1.5. 规格参数 2. 设备使用介绍 2.1. 下载需要使用到的驱动和调试工具 2.2. 启动网关 2.3. DEBUG串口的使用方法 2.4. LED指示灯说明 3. Linux系…

HPV感染的风险:闫会宁主任分析酒店环境中的常见因素

人类乳头瘤病毒(HPV)是一种普遍存在的病毒&#xff0c;其存在和传播方式多种多样。近年来&#xff0c;人们对于HPV的认识不断深入&#xff0c;知道其在酒店环境中的传播风险。本文将探讨哪些情况下在酒店可能感染HPV。 一、HPV的传播方式 HPV主要通过直接接触传播&#xff0c…

RocketMQ快速入门

RocketMQ的发展历史 Apache RocketMQ 是一个开源的分布式消息中间件系统&#xff0c;最初由阿里巴巴集团开发并于2016年贡献给 Apache 软件基金会。以下是 RocketMQ 的发展历史的主要里程碑&#xff1a; 2012年&#xff1a;阿里巴巴内部项目 RocketMQ 最初是阿里巴巴内部的一个…

SpringCloud 微服务全栈体系(四)

第六章 Nacos 配置管理 Nacos 除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 一、统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我们需要一种统一配置管理方案…

Day 11 python学习笔记

模块 内置模块 random random&#xff1a;随机数模块 我们可以在解释器中看到其蕴含的方法 接下来我解释一些常用的方法&#xff1a; random.random( ) random.random( ) 返回0-1的随机数 [0,1) >>> random.random() 0.364183511476754 random.randint(n,m) r…

KNN-水仙花的分类

题目&#xff1a; 思路&#xff1a; 1、处理数据集&#xff0c;这里用的是题目已知的数据集&#xff0c;所以说需要提前将写好的数据放到excel表格里&#xff0c;再进行读取。 2、将数据集划分为训练集和测试集 3、定义K-NN模型。 4、训练模型 5、预测模型 6、计算分类精…

centos7虚拟机部署苍穹私有云环境记录

物理机建议16G内存以上&#xff0c;不然安装gpass过程中带不动虚拟机 步骤1&#xff1a;迅雷下载centos7.9镜像文件&#xff0c;并创建虚拟机&#xff0c;手动安装 http://ftp.sjtu.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso 后面安装gpass时会有校验…

Gerrit | 重磅! 2.x 版本升级到 3.x 版本----转

Gerrit | 重磅! 2.x 版本升级到 3.x 版本 为什么要做版本升级&#xff1f; 2.x known bugs 重大问题不一一列举&#xff0c;这里仅仅是举几个例子&#xff1a; 安全或权限问题&#xff1a;普通用户能看到敏感数据&#xff0c;例如看到其他用户的 hashed api 密码&#xff0c…

conda虚拟环境笔记收录

1、安装conda 增加执行权限&#xff1a; chmod x Anaconda3-2023.03-1-Linux-x86_64.sh 开始执行&#xff1a;./Anaconda3-2023.03-1-Linux-x86_64.sh2、查看版本 conda --version3、查看当前虚拟环境 虚拟环境和全局环境有前缀可见 如果不进行设置&#xff0c;重新启动就变成…