LeetCode——贪心篇(三)

news2025/1/22 8:35:49

目录

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

435. 无重叠区间

763. 划分字母区间

56. 合并区间

738. 单调递增的数字

968. 监控二叉树


刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com

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

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

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

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

输入:points = [[10,16],[2,8],[1,6],[7,12]]
输出:2
解释:气球可以用2支箭来爆破:
-在x = 6处射出箭,击破气球[2,8]和[1,6]。
-在x = 11处发射箭,击破气球[10,16]和[7,12]。
import java.util.Arrays;
import java.util.Comparator;

/**
 * @author light
 * @Description 452. 用最少数量的箭引爆气球
 *
 *
 * (思路:重叠在一起的气球用一只箭射出,
 * 但要注意重叠的右区间:如果下一个气球的左边界小于上一个重叠区间最小的右边界,则这个气球可以被同一只箭引爆
 * @create 2023-09-09 8:25
 */
public class FindMinArrowShotsTest {
	public static void main(String[] args) {
		int[][] points={{10,6},{2,8},{1,6},{7,12}};
		System.out.println(findMinArrowShots(points));

	}
	public static int findMinArrowShots(int[][] points) {
		//先将气球按最左区间从小到大排序
		//int 范围为-2147483648——2147483647,测试案例中会溢出
		Arrays.sort(points, new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				//return o1[0]-o2[0];
				return Integer.compare(o1[0],o2[0]); //采用Integer.compare()不会溢出
			}
		});
		int count=1; //气球不为空则至少需要一只箭
		for (int i = 1; i < points.length; i++) {
			if(points[i][0]>points[i-1][1]){
				count++;
			}else {
				points[i][1]=Math.min(points[i][1],points[i-1][1]);
			}
		}

		return count;
	}
}

435. 无重叠区间

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

输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
import java.util.Arrays;
import java.util.Comparator;

/**
 * @author light
 * @Description 无重叠区间
 *
 *
 * @create 2023-09-10 10:41
 */
public class EraseOverlapIntervalsTest {
	public static void main(String[] args) {
		int[][] intervals={{1,2},{2,3},{3,4},{1,3}};
		System.out.println(eraseOverlapIntervals(intervals));
	}
	public static int eraseOverlapIntervals(int[][] intervals) {
		//先将数组按左边界排序
		Arrays.sort(intervals, new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				return Integer.compare(o1[0],o2[0]);
			}
		});
		int count=0;//记录重叠区间数
		for (int i = 1; i < intervals.length; i++) {
			if(intervals[i][0]<intervals[i-1][1]){ //判断重叠情况
				count++;

				intervals[i][1]=Math.min(intervals[i][1],intervals[i-1][1]);
			}
		}
		return count;
	}
}

763. 划分字母区间

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

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

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

输入:s = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca"、"defegde"、"hijhklij" 。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author light
 * @Description 划分字母区间
 *
 * (思路:遍历字符串,找到每个字符的最远下标
 * @create 2023-09-10 11:07
 */
public class PartitionLabelsTest {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		String s=input.next();
		System.out.println(partitionLabels(s));
	}

	public static List<Integer> partitionLabels(String s) {
		List<Integer> list=new ArrayList<>(); //定义结果集
		int[] edge=new int[27]; //存放元素最远下标
		char[] arr=s.toCharArray();
		for (int i = 0; i < arr.length; i++) {
			edge[arr[i]-'a']=i;
		}
		int idx=0;
		int end=0;
		for (int i = 0; i < arr.length; i++) {
			idx=Math.max(idx,edge[arr[i]-'a']); //找到最远下标
			if(i==idx){
				list.add(idx-end+1); //将长度加入集合中
				end=i+1;
			}
		}
		return list;
	}
}

56. 合并区间

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

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
public static int[][] merge(int[][] intervals) {
		List<int[]> list=new ArrayList<>();
		//将数组按左边界排序
		Arrays.sort(intervals, new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				return Integer.compare(o1[0],o2[0]);
			}
		});
		for (int i = 1; i < intervals.length; i++) {
			if(intervals[i][0]<=intervals[i-1][1]){
				//有重叠,合并区间---求右边界最大值,左区间最小值
				intervals[i][1]=Math.max(intervals[i-1][1],intervals[i][1]);
				intervals[i][0]=Math.min(intervals[i-1][0],intervals[i][0]);
			}else {
				list.add(intervals[i-1]);
			}
		}
		list.add(intervals[intervals.length-1]);
		return list.toArray(new int[list.size()][]);
	}

738. 单调递增的数字

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

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

输入: n = 10
输出: 9

import java.util.Scanner;

/**
 * @author light
 * @Description 单调递增的数字
。
 *
 * (思路:从后向前遍历数字,当遇到Num[i]<Num[i-1]时,只需要令Num[i]=9,Num[i-1]--即可,
 * @create 2023-09-10 13:40
 */
public class MonotoneIncreasingDigitsTest {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int n=input.nextInt();
		System.out.println(monotoneIncreasingDigits(n));
	}
	public static int monotoneIncreasingDigits(int n) {
		String s=String.valueOf(n);
		char[] arr=s.toCharArray();
		int flag=arr.length;
		for (int i =arr.length-1; i >0; i--) {
			if(arr[i-1]>arr[i]){
				arr[i-1]--;
				flag=i; //记录要变为9的下标起始位置
			}
		}
		for (int i = flag; i < arr.length; i++) {
			arr[i]='9';
		}
		return Integer.parseInt(String.valueOf(arr));
	}
}

968. 监控二叉树

给定一个二叉树,我们在树的节点上安装摄像头。

节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。

计算监控树的所有节点所需的最小摄像头数量。

 

    int count=0;
	public int minCameraCover(TreeNode root) {
		if(minCamera(root)==0){ //对根节点进行校验,防止根节点无覆盖
			count++;
		}
		return count;
	}

	private int minCamera(TreeNode root) {
		if(root==null){
			return 2;  //空节点---有覆盖
		}

		//左
		int left=minCamera(root.left);
		//右
		int right=minCamera(root.right);
		//中
		//1.左右孩子都有覆盖---中间父节点无覆盖
		if(left==2&&right==2){
			return 0;
		}else if(left==0||right==0){
			// 2.左右孩子至少一个无覆盖---中间结点父放摄像头
			count++;
			return 1;
		} else  {
			// 3.左右孩子有一个有摄像头---中间父节点有覆盖
			return 2;
		}

	}

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

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

相关文章

系统架构设计专业技能 ·结构化需求分析 - 数据流图

现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 结构化需求分析 - 数据流图 一、数据流图的基本概念二、需…

操作系统——复习笔记

主要是按照王道考研408的ppt进行复习。 概述 操作系统概览 操作系统&#xff08;Operating System&#xff0c; OS&#xff09;是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff1b;以提供给用户和其他软件方便的…

新装Ubuntu系统的一些配置

背景&#xff1a; 最近办公要在Ubuntu系统上进行&#xff0c;于是自己安装了一个Ubuntu22.04系统&#xff0c;记录下新系统做的一些基本配置。 环境 &#xff1a; 系统&#xff1a;Ubuntu-22.04内核&#xff1a;6.2.0-26-generic架构&#xff1a;x86_64 一、 配置root密码 新…

Brief. Bioinformatics2021 | sAMP-PFPDeep+:利用三种不同的序列编码和深度神经网络预测短抗菌肽

文章标题&#xff1a;sAMP-PFPDeep: Improving accuracy of short antimicrobial peptides prediction using three different sequence encodings and deep neural networks 代码&#xff1a;https://github.com/WaqarHusain/sAMP-PFPDeep 一、问题 短抗菌肽(sAMPs)&#x…

明牌空投 — 融资1200万美元的 AlienSwap 交互教程

本文仅为资讯分享&#xff0c;不构成任何投资建议&#xff0c;也不推荐您购买、出售或者持有任何加密货币。请读者朋友们 DYOR&#xff0c;理性看待区块链&#xff0c;提高风险意识&#xff0c;谨慎投资&#xff01; ★ 关于 AlienSwap AlienSwap 是一个基于社区的多链 NFT 聚…

基于Sentinel的微服务保护

前言 Sentinel是Alibaba开源的一款微服务流控组件&#xff0c;用于解决分布式应用场景下服务的稳定性问题。Sentinel具有丰富的应用场景&#xff0c;它基于流量提供一系列的服务保护措施&#xff0c;例如多线程秒杀情况下的系统承载&#xff0c;并发访问下的流量控制&#xff…

MySQL用户密码重设,保姆式教程!

✍前言 我MySQL的root用户密码给忘了&#xff0c;怎么办&#xff1f;MySQL用户如何修改密码&#xff1f;如果你被这类问题所困扰&#xff0c;那么本文将会为你排忧解难&#xff01;(本文基于Windows10和mysql Ver 8.0.33 for Win64 on x86_64版本而创作) 操作步骤 1️⃣First s…

LeetCode刷题笔记【32】:动态规划专题-4(二维背包问题、一维背包问题、分割等和子集)

文章目录 动态规划前置知识背包问题前置知识什么是背包问题, 背包问题举例背包问题的大致分类01背包完全背包 背包问题的通用解法 二维背包问题题目描述解题思路1 构建dp数组2 初始化dp数组3 遍历更新dp数组 代码 一维背包问题题目描述解题思路代码 416. 分割等和子集题目描述解…

Linux设备树详细学习笔记

参考文献 参考视频 开发板及程序 原子mini 设备树官方文档 设备树的基本概念 DT:Device Tree //设备树 FDT: Flattened Device Tree //开放设备树&#xff0c;起源于OpenFirmware (所以后续会见到很多OF开头函数) dts: device tree source的缩写 //设备树源码 dtsi: device …

Vuex核心 - 模块 module(进阶)创建拆分

文章目录 module分模块一、什么是 模块module二、module的好处三、模块创建-拆分 module分模块 一、什么是 模块module 在Vuex中&#xff0c;模块&#xff08;module&#xff09;是用来组织和管理状态&#xff08;state&#xff09;、行为&#xff08;actions&#xff09;、变…

CIO40--数字化转型之回报效益ROI(含表格)

一﹑对BOSS的好处 随时可以由系统中的资料掌握公司的营运状况。建立公司的管理体系及运作规范﹐由系统管理公司运作。建立公司营运的数据库﹐累积公司的管理经验知识﹐不会因人员异动而流失。由系统信息的整合﹐可以提升公司的反应速度﹐不需由人力统计﹐可减少错误﹐节省人力…

3D视觉测量:形位公差 GDT同轴度(附源码)

文章目录 0. 测试效果1. 基本内容2. 公共轴线法3. 实现代码(待添加)目标:通过3D视觉的方法测量圆柱的同轴度 0. 测试效果 1. 基本内容 "同轴度" 是一个工程学和制造业中常用的术语,用来描述一个对象、零件或装置的各个组成部分是否在一个共同的轴线上对齐…

自动驾驶之高精地图介绍

高精地图 文章目录 高精地图前言一、什么是高精地图 前言 一、什么是高精地图 高精地图(High Definitation Map,HD MAP)&#xff0c;和普通导航电子地图的主要区别是精度更高、信息更丰富。精度更高主要体现在高精地图的绝对坐标精度更高(指的是地图上某个目标和外部的真实世…

linux 网络接口的子接口的配置

参考&#xff1a; https://blog.csdn.net/baidu_38803985/article/details/104653205 在 Linux 中&#xff0c;网络接口通常以ethX的形式命名&#xff0c;其中X代表接口的编号&#xff0c;例如eth0代表第一个网络接口&#xff0c;eth1代表第二个&#xff0c;依此类推。虚拟子接…

嵌入式学习笔记(22)汇编实现时钟设置代码详解

4.6.1时钟设置的步骤分析 第1步&#xff1a;先选择不使用PLL。让外部24MHz原始时钟直接过去&#xff0c;绕过APLL那条路。 第2步&#xff1a;设置锁定时间&#xff08;PLL_LOCK&#xff09;。默认值是0x0FFF&#xff0c;保险起见我们设置0xFFFF 第3步&#xff1a;设置分频系…

Linux 服务器连接方式

这里服务器使用 Ubuntu 20.04.6 LTS aarch64&#xff0c;这篇文章就不说使用工具连接了&#xff0c;工具直接添加就好了&#xff0c;这里说下终端命令操作 SSH 命令使用密码连接 使用以下命令在终端进行密码连接 ssh usernamehostname如果是第一次连接 SSH 客户端会提示你是否…

盘点一个os.path.join()函数遇到的小问题(文末赠书)

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 连峰去天不盈尺&#xff0c;枯松倒挂倚绝壁。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python最强王者群【小马哥】问了一个os路径拼接处理的问…

Kafka入门,这一篇就够了(安装,topic,生产者,消费者)

目录 Kafka的安装文件与配置目录binconfig 配置文件server.propertiesproducer.propertiesconsumer.properties 命令行简单使用kafka-topics.sh新增查看列表查看详情修改删除 kafka-console-producer.shkafka-console-consumer.sh 概念集群代理broker主题topic分区partition偏移…

用递归实现字符串逆序(不使用库函数)

文章目录 前言一、题目要求二、解题步骤1.大概框架2.如何反向排列&#xff1f;3.模拟实现strlen4.实现反向排列5.递归实现反向排列 总结 前言 嗨&#xff0c;亲爱的读者们&#xff01;我是艾老虎尤&#xff0c;今天&#xff0c;我们将探索一个题目&#xff0c;这个题目对新手非…

【计算机基础】揭露办公软件WPS、Offfice好用但又很少去做的便捷操作

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…