重生之我在代码随想录刷算法第二十六天 | 452. 用最少数量的箭引爆气球、435. 无重叠区间、 763.划分字母区间

参考文献链接:代码随想录

本人代码是Java版本的,如有别的版本需要请上代码随想录网站查看。

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

力扣题目链接

解题思路

这道题目的意思是比较好理解的,只要我们尽可能的去一箭多雕就能推出全局最优最少的箭。那么如何去最少的箭?

其实这道题目也有点像昨天做的,两个坐标一起判断太困难了。我们先按左边排序,这样基本上相邻的都是可能会重合的。

其次我们去判断i的左边界和i-1的右边界是否重合,重合就不用射箭,不重合就得箭++。当判断该箭和前一个箭重合时,不能就此结束,还得判断是否和下一个箭重合。那么我们就要把当前右边界更新为这两个箭的最小右边界,这样才能覆盖这两个箭的同时去判断下一个箭。

代码示例
class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points,(a,b) -> Integer.compare(a[0],b[0]));
        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. 无重叠区间

力扣题目链接

解题思路

上题我是不太会做的,看了下代码随想录,但这道题和上一题一样很好思考。

我们只要按左边界排队,然后进行比较,比较之后更新右边界的值为更小的那个即可。

代码示例
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals,(a,b) -> {
            return a[0] - b[0];
        });
        int count = 0;
        for(int i = 1;i < intervals.length;i++){
            if(intervals[i - 1][1] > intervals[i][0]){
                count++;
                intervals[i][1] = Math.min(intervals[i][1],intervals[i - 1][1]);
            }
        }
        return count;

    }
}

763.划分字母区间

力扣题目链接

解题思路

这道题目题意就是让每个字母只出现在其中一个片段,并且尽可能划分更多片段。

我们首先用一个数组记录一下每个字母最后出现的次数,然后我们开始遍历字符串,当我们遍历到一个字符串时,我们直到该字符串最后出现的位置前都不能收菜(不能拆分)。直到我们遍历到它为止。当然在这中途我们会遍历其他字符串,这时可能它的最后出现位置更靠后了,那我们就得遍历更多。直到我们遍历到它为止才能切割。

代码示例
class Solution {
    public List<Integer> partitionLabels(String S) {
        List<Integer> list = new LinkedList<>();
        int[] edge = new int[26];
        char[] chars = S.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            edge[chars[i] - 'a'] = i;
        }
        int idx = 0;
        int last = -1;
        for (int i = 0; i < chars.length; i++) {
            idx = Math.max(idx,edge[chars[i] - 'a']);
            if (i == idx) {
                list.add(i - last);
                last = i;
            }
        }
        return list;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值