【算法之贪心算法IV】leetcode56. 合并区间

news2024/11/26 0:52:49

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

力扣题目链接

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

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

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

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

解题思路

  1. 按照结束边界进行排序
  2. 如果前一个结束边界和后一个开始边界不相交,使用箭的数量加一,更新边界值。
  3. 不能用数值相减来判断大小,可能会出现出界的情况。

Java实现

方式一

class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points, new Comparator<int[]>() {
            @Override
            public int compare(int[] point1, int[] point2) {
                return point1[1] < point2[1] ? -1 : 1;
            }
        });
        int pos = points[0][1];
        int ans = 1;
        for (int i = 1; i < points.length; i++) {
            if (points[i][0] > pos) {
                ans++;
                pos = points[i][1];
            }
        }
        return ans;
    }
}

方式二

class Solution {
    public int findMinArrowShots(int[][] points) {
                Arrays.sort(points, new Comparator<int[]>() {
            @Override
            public int compare(int[] point1, int[] point2) {
                return point1[0] < point2[0] ? -1 : 1;
            }
        });
        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][1], points[i][1]);
            }
        }
        return count;
    }
}

435. 无重叠区间

力扣题目链接

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

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

解决思路

  1. 使用动态规划,res[i]表示以第i个区间为结束区间,最大的不重叠区间的个数。公式推导。
  2. 贪心算法。

Java实现

方式一:

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return Integer.compare(o1[1], o2[1]);
            }
        });
        int n = intervals.length;
        int pos = intervals[0][1];
        int res = 1;
        for (int i = 1; i < n; i++) {
            if (intervals[i][0] >= pos) {
                res++;
                pos = intervals[i][1];
            }
        }
        return n - res;
    }
}

方式二:

class Solution {

    public 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 n = intervals.length;
        int[] res = new int[n];
        Arrays.fill(res, 1);
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if (intervals[j][1] <= intervals[i][0]) {
                    res[i] = Math.max(res[j] + 1, res[i]);
                }
            }
        }
        return n - Arrays.stream(res).max().getAsInt();
    }
}

763.划分字母区间

力扣题目链接

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

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

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

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

解决思路

  1. 保证所有出现的字符最开始的元素和最后的元素都在一个片段中。

Java实现

class Solution {
    public List<Integer> partitionLabels(String s) {
        int start=0, end = 0;
        int len = s.length();
        int[] data = new int[26];
        List<Integer> res = new ArrayList<>();
        for (int i = 0; i < s.length(); i++) {
            data[s.charAt(i) - 'a'] = i;
        }
        for (int i = 0; i < len; i++) {
            end = Math.max(data[s.charAt(i) - 'a'], end);
            if (i == end) {
                res.add(end - start + 1);
                start = end + 1;
            }
        }
        return res;
    }
}

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].

解决思路

  1. 使用链表。判断是否有重合区间。

Java区间

class Solution {
    public int[][] merge(int[][] intervals) {
        LinkedList<int[]> res = new LinkedList<>();
        Arrays.sort(intervals, (a, b) -> {
            return Integer.compare(a[0], b[0]);
        });
        res.add(intervals[0]);
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] <= res.getLast()[1]) {
                res.getLast()[1] = Math.max(res.getLast()[1], intervals[i][1]);
            } else {
                res.add(intervals[i]);
            }
        }
        return res.toArray(new int[res.size()][]);
    }
}

738.单调递增的数字

力扣题目链接

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

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

输入: n = 332
输出: 299

解决思路

  1. 找到数组中第一个元素比前面一个元素小的
  2. 前面一个元素的值减一,start--,直到前面元素小于等于当前元素。
  3. 更新start+1到最后的元素,都改为9。
  4. 1221的最大元素是1199

Java实现

class Solution {
    public int monotoneIncreasingDigits(int n) {
        String s = String.valueOf(n);
        char[] chars = s.toCharArray();
        int start = 1;
        while (start < s.length() && chars[start - 1] <= chars[start]) {
            start++;
        }
        //找到数组中第一个元素比前一个元素大
        if (start < s.length()) {
            while (start > 0 && chars[start - 1] > chars[start]) {
                chars[start - 1]--;
                start--;
            }

            for (int i = start + 1; i < chars.length; i++) {
                chars[i] = '9';
            }
        }
        return Integer.parseInt(new String(chars));

    }
}

968.监控二叉树

力扣题目链接

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

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

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

输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。

解决思路

  1. 覆盖就是当前节点是否被照亮。
  2. 当子节点有一个没有被覆盖,那么当前节点必须要点灯;当子节点都亮了,那么当前节点最好是无覆盖(当前节点在当前子树上是无覆盖的,如果还有父节点,让父节点点灯;如果当前节点是根节点,根据定义,根节点也需要点灯)

Java实现

class Solution {

    int count = 0;

    public int minCameraCover(TreeNode root) {
        if (minCame(root) == 0) {
            count++;
        }
        return count;
    }

    /**
     * 0  无覆盖  1 有摄像头   2  覆盖
     *
     * @param root
     * @return
     */
    public int minCame(TreeNode root) {
        if (root == null) {
            //空节点默认是有覆盖,避免在叶子节点上放摄像头
            return 2;

        }
        int left = minCame(root.left);
        int right = minCame(root.right);
        if (left == 2 && right == 2) {
            return 0;
        } else if (left == 0 || right == 0) {
            count++;
            return 1;
        } else {
            return 2;
        }

    }
}

在这里插入图片描述

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

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

相关文章

cisp 记录(第一,二章节)

第一章信息安全保障 1.信息安全保障基础 1.1信息安全的概念 1.2信息安全属性 1.3信息安全视角 1.4信息安全发展阶段 1.5信息安全保障新领域 2安全保障体系框架 2.1基于时间的PDR和PPDR模型 2.2信息安全保障技术框架 2.3信息系统安全保障评估框架 2.4企业安全架构 1.1信息安全…

mysql基础4——单机多实例部署

文章目录 一、手动部署二、脚本部署 前提了解&#xff1a; 适用于服务器不够&#xff0c;但需要把业务区分开的情况下&#xff0c;可以部署此方式。比如多个业务平台使用的数据库不同&#xff0c;不能只创建一个数据库&#xff0c;这时候就需要部署多实例。实际情况中能避免此方…

BOSHIDA 检测DC电源模块的稳定性能的几个步骤

BOSHIDA 检测DC电源模块的稳定性能的几个步骤 检测DC电源模块的稳定性能需要进行以下几个步骤&#xff1a; 1. 确认测试设备&#xff1a;需要准备一台多功能电源和一台数字万用表&#xff0c;可以根据需要选用不同型号和规格的测试设备。 2.设置电源参数&#xff1a;根据DC电…

DEM获取地形和计算点是否在矩形面积内的算法

1准备一个DEM地形&#xff0c;打开GlobalMap,如下选择 选择否&#xff0c;生成边界 将边界导出为shp文件&#xff0c;打开QGIS&#xff0c;安装get wkt插件&#xff0c;选择对应坐标系&#xff0c;获取wkt,如图 , 附判断点是否在此坐标范围内代码 /// <summary>/// 判断点…

echarts 柱形图 Y轴数据多,鼠标滚动显示数据,不缩放

坐标轴数据太多&#xff0c;只能滚动显示&#xff0c;滚动的时候&#xff0c;不想缩放&#xff0c;单纯平移就好。 滚动后第二屏的截图 没滚动的&#xff0c;第一屏的截图 option {title: {// text: World Population,},tooltip: {trigger: axis,axisPointer: {type: shadow,}…

15 年开源路,从大厂搬砖到创业挖坑

上个月回蚂蚁做了一场有关开源的分享&#xff0c;让我讲讲离开公司自己做开源创业后的感想。 正好借着端午节的时间&#xff0c;也更完整地回顾一下自己职业生涯 15 年来和开源结缘的经历。 邂逅 Cappuccino 08 年参加工作后&#xff0c;第一个投入精力的开源项目是 Objective…

安装Home Assistant

文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 转载自远程穿透的文章&…

网络安全 | 密码基础知识介绍

概述 密码介绍 安全问题 保密性&#xff1a;对发送的消息进行获取完整性&#xff1a;对发送的消息进行篡改身份伪造&#xff1a;对发送的主体身份进行篡改&#xff0c;a发的消息&#xff0c;篡改为b发的行为抵赖&#xff1a;对发送的消息进行否认&#xff0c;丧失行为的可追…

VulnHub打靶记录——easy_cloudantivirus

靶机下载地址&#xff1a;https://www.vulnhub.com/entry/boredhackerblog-cloud-av,453/ 将靶机设置为NAT模式并启动。 主机发现&信息收集 nmap扫描本地网段 nmap -sn 192.168.50.1/24136是kali&#xff0c;137就是我们的目标靶机。 接着收集靶场信息&#xff1a; n…

【 Android11 WiFi开发 二 】WiFi连接、断开

前言 上篇文章介绍了WiFi列表的获取与展示和WiFi状态改变的广播监听&#xff0c;本篇将介绍介绍对WiFi的操作&#xff0c;连接、忘记&#xff0c;查看已连接的WiFi信息等。 相关文章 1、【 Android11 WiFi开发 一 】WiFi列表获取与展示 说明 老规矩&#xff0c;先把WiFi连接和…

卷积基础知识总结

卷积是卷积神经网络中的核心模块&#xff0c;卷积的目的是提取输入图像的特征&#xff0c;如下图所示&#xff0c;卷积可以提取图像中的边缘特征信息。卷积也称为过滤器&#xff0c;即Filter 1 卷积的计算方法 卷积运算本质上就是在滤波器和输入数据的局部区域间做点积 注意…

MyBatis介绍与安装下载

目录 MyBatis 介绍 MyBatis 主要特点 MyBatis 下载 创建 Maven 工程 IDEA 连接数据库 导入JAR文件到项目 MyBatis 介绍 MyBatis是一种开源的Java持久化框架&#xff0c;用于将SQL数据库访问和映射任务与Java对象之间的映射分离。它提供了一种简单的方式来对数据库进行操…

消息中间件的首选之一:探索RocketMQ的优势和特性

​​​​​​​ 1、简介 RocketMQ 是一款开源的分布式消息队列系统&#xff0c;由阿里巴巴集团开发并开源。它是为了满足大规模分布式系统中的消息通信和异步解耦需求而设计的&#xff0c;具有高吞吐量、低延迟、可靠性强等特点。下面将详细介绍 RocketMQ 的架构、组件和关键特…

【网络进阶】Posix API与网络协议栈(三)

文章目录 1. 网络攻击和POSIX API与网络协议栈的关系1.1 网络攻击的基本概念和它们对协议栈的影响1.2 分布式拒绝服务&#xff08;DDoS&#xff09;攻击和网络协议栈1.3 地址解析协议&#xff08;ARP&#xff09;欺骗和POSIX API 2. 网络协议栈的理解和划分2.1 OSI七层模型2.2 …

AI 边缘计算控制器GEAC91

1 产品概览 产品概览 GEAC91 AI边缘计算控制器是一款基于 NVIDIA Jetson AGX Xavier处理 器、面向智能边缘计算应用场景的解决方案。 GEAC91控制器具有 控制器具有 GMSL2、 千兆网口CAN总线、 RS232、RS422、 USB3.0、USB2.0、SD卡等丰富的外设接口 &#xff0c;支持常见激光雷…

记录--不定高度展开收起动画 css/js 实现

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 不定高度展开收起动画 最近在做需求的时候&#xff0c;遇见了元素高度展开收起的动画需求&#xff0c;一开始是想到了使用 transition: all .3s; 来做动画效果&#xff0c;在固定高度的情况下&#xf…

霍尔闭环电流传感器在电动观光旅游车上的应用

摘要&#xff1a;本文介绍了基于霍尔闭环原理&#xff0c;即磁平衡式原理的电流传感器在电动观光旅游车上的使用方法&#xff0c;替代传统的霍尔器件&#xff0c;较好的解决了电动车行业现有霍尔传感器的基本问题&#xff0c;在稳定性上更加优越。 关键词&#xff1a;霍尔闭环…

2022 年首届“钉钉杯”大学生大数据挑战赛B题:航班数据分析与预测——国奖论文代码分享

2023年的钉钉杯挑战赛马上要来了~这里给大家分享一下去年的国奖论文思路与代码 摘要&#xff1a; 随着民航事业的迅速发展 , 飞机出行已成为未来发展的一种必然趋势&#xff0c;然而近年来&#xff0c; 航班延误现象频频发生&#xff0c;成为困扰机场和航空公司的难题。对航班…

Idea项目application.properties配置文件默认GBK,如何设置默认为UTF-8编码

简述&#xff1a;java程序在项目中一般设置都是UTF-8编码格式&#xff0c;但是项目application.properties 文件默认是GBK,需要手工修改默认编码格式 步骤&#xff1a; file->setting->editor->file encodings下&#xff0c;勾选transparent native-to-ascll conver…

AR远程协助平台运用到建筑领域能带来哪些帮助?

随着科技的不断发展&#xff0c;远程协同培训已经成为了一种越来越受欢迎的学习方式。在建筑施工领域中&#xff0c;这种学习方式同样具有很大的应用价值。本文将探讨AR远程协助平台在建筑施工中的应用。 首先&#xff0c;AR远程协助平台可以提高建筑施工的效率和质量。传统的…