代码随想录算法训练营Day30 | 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.划分字母区间

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

问题描述:

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

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

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

解决方式:

每次找最小右边界,确保第一支箭可以射中尽可能多的气球,注意初始化count为1,因为至少需要一支箭

class Solution {
    public int findMinArrowShots(int[][] points) {
        //Integer.compare防止整数溢出
        Arrays.sort(points,(a,b)->Integer.compare(a[0],b[0]));
        int count=1;
        for(int i=0;i

435. 无重叠区间

问题描述:

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

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

解决方式:

每次删除右边界更大的区间,确保每个区间的影响范围尽量小

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        /**
        每次遇到重叠的区间时,保留结束更早的区间(即右边界更小的区间),
        移除结束较晚的区间(即右边界更大的区间)。​
        **/
        if (intervals.length == 0) return 0;
        Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));
        int count=0;
        int lastEnd = intervals[0][1];//记录最小右边界
       
        for(int i =1;i

763.划分字母区间

问题描述:

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。例如,字符串 "ababcc" 能够被分为 ["abab", "cc"],但类似 ["aba", "bcc"] 或 ["ab", "ab", "cc"] 的划分是非法的。

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

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

解决方式:

先用map记录每个字母的最后出现位置,更新end为当前扫过的字母的最大边界,让当前字母范围能覆盖其他字母区间,确保相同字母只出现在一个区间,收集集合时机为当前遍历索引等于end的时候

class Solution {
    public List partitionLabels(String s) {
        Map map = new HashMap<>();
        for(int i=0;i res = new ArrayList<>();
        for(int i=0;i

你可能感兴趣的:(数据结构,算法)