首页 > 编程语言 >代码随想录算法训练营第三十天| 452. 用最少数量的箭引爆气球 、435. 无重叠区间 、763.划分字母区间。c++转java

代码随想录算法训练营第三十天| 452. 用最少数量的箭引爆气球 、435. 无重叠区间 、763.划分字母区间。c++转java

时间:2024-11-14 17:15:42浏览次数:3  
标签:int 随想录 ++ range intervals result 区间 435

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

思路:以前做过最大不相交子序列的题,这次也是往这根据某一端排序的思路想的,排序后如下图,只需要维护一个公共序列的右边界r就可以了,下一次判断时,只需要判断子区间的左边是否小于r。

这个题有点坑的是使用Arrays排序,如果使用昨天的方法:

        Arrays.sort(points,(a,b)->{
            if(a[0] == b[0]) return a[1] - b[1];
            return a[0] - b[0];
        });

就会出现数据溢出,使用Integer自己compare函数就不会啦,完整代码如下:

class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points,(a,b)-> Integer.compare(a[0], b[0]));
        int r = points[0][1];
        int result = 1;
        for(int i = 1;i < points.length;i++){
            if(points[i][0] <= r){
                r = Math.min(r,points[i][1]);
            }else{
                result++;
                r = points[i][1];
            }
        }
        return result;
    }
}

详细解说:代码随想录

435. 无重叠区间

思路:维护右边界,详细看这里:代码随想录

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        if(intervals.length == 1)
            return 0;
        Arrays.sort(intervals,(a,b)-> Integer.compare(a[1],b[1]));
        int result = 0;
        int r = intervals[0][1];
        for(int i = 1;i < intervals.length;i++){
            //说明重叠了
            if(intervals[i][0] < r){
                result++;
            }else{
                // 不重叠就更新一下
                r = intervals[i][1];
            }
        }
        return result;
    }
}

763.划分字母区间

思路:根据字母划分出区间,然后将区间排序,然后求最大不相交子区间的长度。

class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> result = new ArrayList<>();
        int[][] range = new int[26][2];
        // 初始化,便于后面对左区间进行赋值
        for(int i = 0;i < 26;i++){
            range[i][0] = -1;
        }
        //确定左右区间,因为for是往后遍历的,所以右区间直接取最新的就好了:range[index][1] = i;
        for(int i = 0;i < s.length();i++){
            int index = s.charAt(i) - 'a';
            if(range[index][0] == -1)
                range[index][0] = i;
            range[index][1] = i;
        }
        //按照右区间进行排序
        Arrays.sort(range,(a,b) -> Integer.compare(a[0],b[0]));
        //找到第一个有效的字母区间
        int left = 0;
        while(range[left][0] == -1)
            left++;
        //求不相交的子区间
        int l = range[left][0],r = range[left][1];
        for(int i = left + 1;i < 26;i++){
            if(range[i][0] < r){
                r = Math.max(r,range[i][1]);
            }else{
                result.add(r - l + 1);
                l = range[i][0];
                r = range[i][1];
            }
        }
        result.add(r - l + 1);
        return result;
    }
}

标签:int,随想录,++,range,intervals,result,区间,435
From: https://blog.csdn.net/weixin_46002954/article/details/143773144

相关文章

  • 代码随想录算法训练营 | 200.岛屿的数量
    岛屿的数量题目链接:https://leetcode.cn/problems/number-of-islands/此题目要点:dfs和bfs都可以解决此题,但是使用dfs代码会更加的简洁首先对grid进行遍历,每一个节点都进行检查,判断是否是1(陆地)如果是,则进行dfs深搜,并将所有搜到的岛屿节点全置为0,表示此块岛屿已经被搜过了,防......
  • 【题解】洛谷P1712: [NOI2016] 区间
    P1712[NOI2016]区间我对尺取法并不敏感,所以感觉有点难度,我们想到按照区间长度排序加入使得满足单调性,直到有一个区间的覆盖次数达到了m就可以计算了,而这个就是尺取法,单调性使得我们答案总是最优的。覆盖次数就可以用线段树做,而且数据范围很大需要离散化,计算答案时注意把答案带......
  • 【华为OD机试真题E卷】573、区间交叠问题 | 机试真题+思路参考+代码解析(E卷复用)(C++、J
    文章目录一、题目......
  • 代码随想录算法训练营day45| 115.不同的子序列 583. 两个字符串的删除操作 72.
    学习资料:https://programmercarl.com/0115.不同的子序列.html#算法公开课动态规划系列之编辑距离问题学习记录:115.不同的子序列(当遇到相同字母时,可以选择也可以不选;刚开始没看懂;dp[i][j]是对应i-1结尾和j-1结尾,这样的目的是方便第一行和第一列初始化)点击查看代码classSolut......
  • 代码随想录:二分查找
    代码随想录:二分查找二分法标志:数组顺序排列且无重复简单的二分法,写法是左闭右闭的写法,此种情况的left可以等于right,故while里有等号。classSolution{public:intsearch(vector<int>&nums,inttarget){intleft=0;intright=nums.size()-1;......
  • 代码随想录:移除元素
    代码随想录:移除元素题目中的原地指的是不能开创新的数组。简单双指针解决问题,实际上是vector中的erase的实现原理//erase和迭代器的使用方法std::vector<int>vec={1,2,3,4,5};autoit=vec.begin()+2;//指向元素3//这所谓迭代器其实就是封装后的指针啊vec.era......
  • 区间整除
    Q6.1.3.3区间整除题意:区间加,区间整除,区间和,区间最小值.Sol1区间整除时若当前区间\(\max=\min\),改成区间覆盖,否则继续复杂度玄学Sol2有一波性质分析:发现\(\left\lfloor\dfracxk\right\rfloor-\left\lfloor\dfrac{x-1}k\right\rfloor\le1\)稍微推广一下:\(x-1-\left\lf......
  • 代码随想录算法训练营第二十五天| leetcode491.递增子序列、leetcode46.全排列、leetc
    1leetcode491.递增子序列题目链接:491.非递减子序列-力扣(LeetCode)文章链接:代码随想录视频链接:回溯算法精讲,树层去重与树枝去重|LeetCode:491.递增子序列_哔哩哔哩_bilibili思路:用之前的方法,结果翻车了,好好看视频学新技能吧1.1视频后的思路真的没想到用set来去重,还是基......
  • 代码随想录算法训练营 | 所有可达路径
    所有可达路径文章链接:https://programmercarl.com/kamacoder/0098.所有可达路径.html#本题代码题目链接:https://kamacoder.com/problempage.php?pid=1170#include<iostream>#include<vector>usingnamespacestd;//全局路径vector<vector<int>>paths;vector<in......
  • P8868 [NOIP2022] 比赛(线段树维护区间历史和)
    题意给定排列\(a,b\),\(q\)次询问\(l,r\),你需要求出\(\sum_{l\lel'\ler'\ler}(\max_{i=l'}^{r'}a_i)(\max_{i=l'}^{r'}b_i)\)对\(2^{64}\)取模的值。\(n,q\le2.5\times10^5\)分析根据经典套路,按\(r\)扫描线,维护两个单调栈,那么加入一个数就相当于进行若干段区......