【Leetcode】贪心 区间问题 | 用最小数量的箭引爆气球、无重叠区间、划分字母区间、合并区间

news2024/12/27 0:19:32

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

更像一个重叠区间问题,贪心策略:应该在重叠最多处射出。

按区间左端点递增序进行排序,左端点相同时,按右端点递增序排序。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MRfAe6KS-1686373838872)(【Leetcode】贪心-区间问题/image-20230609221540290.png)]

现在欲射穿气球 i i i,当发现相邻的两个区间有重叠时,重叠部分为 [ s t a r t i + 1 , min ⁡ { e n d i , e n d i + 1 } ] [start_{i+1},\min\{end_{i}, end_{i+1}\}] [starti+1,min{endi,endi+1}],此时至少可以一箭双雕。

所以策略为:不断判断当前重叠区间是否与下一个区间相交,(1) 若相交,可将下一个区间加入,一同射穿,同时更新当前重叠区间。(2) 不相交,需要一支新的箭,更新count,转向判断下一个区间。

注意:一个不太好de的bug,Comparator里不能直接写o1[0] - o2[0],而应该使用比较运算符判断,否则可能会溢出。

import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public int findMinArrowShots(int[][] points) {
        int n = points.length;

        Arrays.sort(points, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if (o1[0] != o2[0]) {
                    return o1[0] < o2[0] ? -1 : 1;
                }
                return o1[1] < o2[1] ? -1 : 1;
            }
        });

        // 开始时射出一枚箭
        int count = 1;
        int[] overlap = points[0];

        for (int i = 1; i < n; i++) {
            // 当前区间和overlap区间有重叠
            if (overlap[1] >= points[i][0]) {
                // 因为左端点递增,所以新的左端点一定来自下一个区间,新的右端点通过比较得到
                overlap = new int[]{points[i][0], Math.min(overlap[1], points[i][1])};
            }
            else {
                // 与overlap区间没有重叠,需要多射出一枚弓箭
                count++;
                overlap = points[i];
            }
        }

        return count;
    }
}

435 无重叠区间

贪心策略:选择可加入区间中,右端点最小的区间。

实现方法:按照右端点优先排序,右端点相同时,左端点更大优先。

[2,4]
[3,4] √
  • 维护变量 r i g h t B o r d e r rightBorder rightBorder,表示区间的左边界应大于等于 r i g h t B o r d e r rightBorder rightBorder

  • 如果左端点大于等于当前右边界,说明没有重叠,可以加入, c o u n t count count增加,并更新 r i g h t B o r d e r rightBorder rightBorder

import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        // 更小的右端点优先,右端点相同时,更大的左端点优先
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if (o1[0] == o2[0] && o1[1] == o2[1]) {
                    return 0;
                }
                if (o1[1] != o2[1]) {
                    return o1[1] < o2[1] ? -1 : 1;
                }
                return o1[0] < o2[0] ? 1 : -1;
            }
        });

        int count = 1;
        int rightBorder = intervals[0][1];

        for (int i = 1; i < intervals.length; i++) {
            // 如果左端点大于等于当前右边界,说明没有重叠,可以加入
            if (intervals[i][0] >= rightBorder) {
                count++;
                rightBorder = intervals[i][1];
            }
        }

        return intervals.length - count;
    }
}

463 划分字母区间

  1. 统计每一个字符最后出现的位置
  2. 从头遍历字符,记录所有字符的最远出现下标 b o r d e r border border,如果字符的下标与最远出现下标相等,则找到了分割点。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0TVLSFAd-1686373838873)(【Leetcode】贪心-区间问题/image-20230610105612757.png)]

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

class Solution {
    public List<Integer> partitionLabels(String s) {
        
        HashMap<Character, Integer> farthest = new HashMap<>();

        char[] word = s.toCharArray();

        for (int i = 0; i < word.length; i++) {
            farthest.put(word[i], i);
        }

        int border = -1;
        int count = 0;
        List<Integer> res = new ArrayList<>();

        for (int i = 0; i < word.length; i++) {
            // 先更新border
            border = Math.max(border, farthest.get(word[i]));
            count++;
            // 再检查下标是否和border相等
            if (i == border) {
                res.add(count);
                count = 0;
            }
        }

        return res;
    }
}

56 合并区间

按照左端点递增序排序,左端点相同时,按照右端点递减序排序。

遍历区间:

  • 如果当前区间的左端点小于等于右边界,说明当前区间有重叠,可以合并,更新右边界为二者中的更大值

    [1,4], [2,3]
    overlap[1] = Math.max(overlap[1], intervals[i][1]);
    
  • 否则说明没有重叠,将重叠区间 o v e r l a p overlap overlap加入结果集,并更新 o v e r l a p overlap overlap为当前区间。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

public class Solution {
    public int[][] merge(int[][] intervals) {
        // 按照左端点递增,右端点递减序排序
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if (o1[0] == o2[0] && o1[1] == o2[1]) {
                    return 0;
                }
                if (o1[0] != o2[0]) {
                    return o1[0] < o2[0] ? -1 : 1;
                }
                return o1[1] < o2[1] ? -1 : 1;
            }
        });

        ArrayList<int[]> merged = new ArrayList<>();
        int[] overlap = intervals[0];

        for (int i = 1; i < intervals.length; i++) {
            // 如果有重叠,可以合并
            if (overlap[1] >= intervals[i][0]) {
                overlap[1] = Math.max(overlap[1], intervals[i][1]);
            }
            else {
                merged.add(overlap);
                overlap = intervals[i];
            }
        }

        merged.add(overlap);

        return merged.toArray(new int[merged.size()][]);
    }
}

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

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

相关文章

[230604] 听力TPO66汇总·上篇| C1 L1 C2|10:20~12:00

目录​​​​​​​ Science Fiction And Sci-fi-C1 错题分析 C1-3 细节双选题 C1 精听练习 做题笔记 Financial Advice-C2 全对 C2 精听练习 Sleep-L1 错题分析 L1-4 细节题 L1-5 细节双选题 L1 精听练习 做题笔记 词汇&#xff1a;http://t.csdn.cn/Zhuws 两篇对…

编译型语言与解释型语言的区别

用比喻来明编译型语言和解释型语言的区别&#xff1a; 假设你要理解一本书&#xff08;源代码&#xff09;将转化为一篇演讲稿&#xff08;机器代码&#xff09;。 编译型语言类似于你将整本书翻译成一篇演讲稿。你需要在事先对整本书进行翻译&#xff0c;将其转化为一份完整…

chatgpt赋能python:Python如何使用while函数倒序输出数字?

Python如何使用while函数倒序输出数字&#xff1f; Python是一种高级编程语言&#xff0c;它易于学习、易于使用&#xff0c;这使得它成为了非常受欢迎的编程语言之一。Python在各种应用程序中都有着广泛的应用&#xff0c;从Web开发到数据分析&#xff0c;甚至是人工智能等领…

脑疾病患者福音,又一家脑机接口公司完成首次人体试验

近日&#xff0c;脑机接口公司Precision Neuroscience宣布完成其神经植入系统的首次人体临床试验&#xff0c;该公司设计的植入系统在1平方厘米的面积上有1024个微型电极&#xff0c;这些电极被嵌入到与大脑表面一致的柔性薄膜中。这种薄膜只有人类头发厚度的五分之一&#xff…

chatgpt赋能python:Python中如何倒着输出字符串

Python中如何倒着输出字符串 在Python编程中&#xff0c;字符串是一种不可避免的数据类型&#xff0c;我们往往需要对字符串进行各种操作。其中&#xff0c;倒着输出字符串是一项基本的操作&#xff0c;对于初学者来说&#xff0c;可能并不是很容易理解。本文将介绍如何使用Py…

【算法题001】面试题 01.01. 判定字符是否唯一

题目来源&#xff1a;《程序员面试金典&#xff08;第 6 版&#xff09;》 1、Problem: 面试题 01.01. 判定字符是否唯一 文章目录 面试题 01.01. 判定字符是否唯一一、题目描述二、解决方案&#xff08;一&#xff09;方案一1、解题思路2、解题方法3、复杂度4、代码实现 &…

二本4年Java经验,大佬五面阿里(定薪45K)

前段时间刚面试上岸&#xff0c;先后面试了各大小公司&#xff0c;拿了一些 offer&#xff0c;有阿里&#xff0c;滴滴&#xff0c;快手&#xff0c;达达&#xff0c;得物等公司。面试的公司大部分都能过&#xff0c;所以这里给大家分享下自己的经验&#xff0c;也给自己做个归…

地震勘探基础(十二)之地震偏移处理

地震偏移处理 地震数据常规处理主要包括地震反褶积&#xff0c;水平叠加和地震偏移成像三大类。地震反褶积通过压缩地震子波提高地震分辨率&#xff0c;水平叠加的目的是提高信噪比&#xff0c;地震偏移成像的目的是提高地震空间分辨率和地震保真度。 在20世纪50年代&#xf…

【1】Midjourney新手必读

Midjourney官网网站&#xff1a;https://www.midjourney.com/ 问题一&#xff1a;Midjourney是什么 Midjourney 是 AI 生成算图工具&#xff0c;输入文字就会自动产生图像&#xff0c;目前架设在Discord频道上。 问题二&#xff1a;Discord频道是什么 Discord是国外的一个社…

Matlab快速入门——数组

学习目标&#xff1a;学习关于数组的详细知识&#xff08;喜欢的别忘记点赞收藏呦&#xff09; clear all; A[] %空数组 B[5 6 5 4 1] %行向量 C[5,5,5,4,4] %行向量 D[3;3;3;3;5] %列向量 EC %对行向量转置得到列向量 clear all…

实验篇(7.2) 09. 通过安全隧道走对方宽带上网 (FortiClient-IPsec) ❀ 远程访问

【简介】要想所有的流量都走安全隧道&#xff0c;就需要禁用隧道分割。这样上网流量也会通过隧道到达远端防火墙&#xff0c;再通过远端防火墙的宽带接口去到互联网。我们来看看FortiClient客户端用IPsec VPN是如何实现的。 实验要求与环境 OldMei集团深圳总部防火墙有两条宽带…

006:vue中el-tree 添加右键菜单的方法

第006个 查看专栏目录: 按照VUE知识点 ------ 按照element UI知识点 echarts&#xff0c;openlayers&#xff0c;cesium&#xff0c;leaflet&#xff0c;mapbox&#xff0c;d3&#xff0c;canvas 免费交流社区 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏…

document.URL与document.documentURI

document.URL与document.documentURI document.URL document.URL 返回当前文档的 URL 地址 该属性的值和DOM Level 0 中的document.location.href 属性的值是相等的。然而 document.location.href 是可写的&#xff0c;document.URL 是只读的。 document.documentURI 也返回…

【Linux】动态库与静态库,如何打包库,如何使用第三方库

文章目录 回顾基础学会打包自己的库并使用静态库打包库第三方库的使用 动态库打包库第三方库的使用 动态库加载以及周边问题 回顾基础 这篇文章主要对动静态库进行进一步的学习&#xff0c;关于动静态库的一些基础知识&#xff0c;请点击这篇文章的链接&#xff1a;【Linux】初…

【Docker】如何实现Docker 命令自动补全

前言 Docker 命令可以使用 tab 键补全。在命令行输入 Docker 命令时&#xff0c;只需输入前几个字符&#xff0c;然后按 Tab 键即可自动补全为正确的命令或参数。 例如&#xff0c;在命令行输入 docker r&#xff0c;然后按 Tab 键&#xff0c;就会自动补全为 docker run 命令…

YOLOv7训练自定义数据集

使用YOLOv7做对比实验&#xff0c;需要重新部署一下YOLO环境&#xff0c;并将COCO格式数据集转换为YOLO格式 博主的COCO数据集是由WiderPerson数据集转换来的&#xff0c;并且做了一些处理。 环境 Ubuntu18.0 CUDA11.2 NVIDIA T4 项目部署 下载项目&#xff1a; git clone…

SSM-Spring+SpringMVC+MyBatis框架的水果商城网站

项目介绍 主要功能&#xff1a; 前端用户购物端&#xff1a; ①角色信息&#xff1a;用户注册、用户登录、个人中心 ②个人中心&#xff1a;基本信息、我的订单、商品收藏、修改密码 ③首页管理&#xff1a;公告、留言、折扣大促销、热门商品 ④商品详情&#xff1a;收藏、加入…

基于Fragstats做土地利用景观格局分析详细流程

随城市化进程加快&#xff0c;城市经济迅速发展&#xff0c;城市面积不断向外扩展&#xff0c;景观空间组分不断发生变化&#xff0c;主要表现为&#xff1a;生态斑块支离破碎&#xff0c;生物多样性降低&#xff0c;原始的乡村田野景观被现代化建设用地取代&#xff1b;交通网…

数据结构与算法之树结构

目录 为什么要使用树结构树结构基本概念树的种类树的存储与表示常见的一些树的应用场景为什么要使用树结构 线性结构中不论是数组还是链表,他们都存在着诟病;比如查找某个数必须从头开始查,消耗较多的时间。使用树结构,在插入和查找的性能上相对都会比线性结构要好 树结构…

POSTGRESQL NEON - Serverless 式的POSTGRESQL 数据库的独特技能 分支数据

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…