代码随想录算法训练营第三十六天|435. 无重叠区间、763.划分字母区间、56. 合并区间

435. 无重叠区间

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        //这行代码是对一个二维数组intervals进行排序,
        //根据每个子数组的第一个元素进行升序排序。
        //Lambda表达式(a,b)-> { return Integer.compare(a[0],b[0]);} 
        //是用来定义比较规则的,比较的是每个子数组的第一个元素。
        //Arrays.sort方法会根据这个比较规则对intervals进行排序。
        Arrays.sort(intervals, (a, b) -> {
            return Integer.compare(a[0], b[0]);
        });
        int result = 1;
        for(int i = 1; i < intervals.length; i++){
            //若当前的左点小于上一个的右点,说明两个有公共部分
            if(intervals[i][0] < intervals[i - 1][1]){
                //更新当前的右点,便于当成下一个点的上一个的右点来进行比较
                //确定右点需要这一个的右点和上一个右点的最小值,以便来确定下一个与这两个的重叠部分有重叠
                intervals[i][1] = Math.min(intervals[i - 1][1], intervals[i][1]);
                continue;
            }else{
                //当前和上一个没有重叠部分,则无重叠区间+1
                result++;
            }
        }
        //返回需要移除区间的最小数量
        return intervals.length - result;
    }
}

763.划分字母区间

class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> result = new LinkedList<>();
        //使用类似桶排序的方式,一共有26个英文字母
        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 = 0;
        for(int i = 0; i < chars.length; i++){
            idx = Math.max(idx, edge[chars[i] - 'a']);
            //当前位置已经到了更新后的当前区域的最远的位置
            if(i == idx){
                //说明当前区域遍历已经结束,加入结果集,并更新下一区域的起始
                result.add(i - last + 1);
                last = i + 1;
            }
        }
        return result;
    }
}

56. 合并区间

class Solution {
    public int[][] merge(int[][] intervals) {
        //定义二维数组做结果存储
        List<int[]> result = new LinkedList<>();
        //lambda表达式中的比较函数会根据每个区间的第一个元素进行比较
        //从而实现对区间数组的按照第一个元素升序排序。
        Arrays.sort(intervals, (x, y) -> Integer.compare(x[0], y[0]));
        //初始化最小左边界为start
        int start = intervals[0][0];
        int mostRightBound = intervals[0][1];
        for(int i = 1; i < intervals.length; i++){
            //若当前左边界大于最大有边界(小于等于都算重叠)
            if(intervals[i][0] > mostRightBound){
                //加入结果区间并更新start
                //将一个新的整数数组[start, rightmostRightBound]添加到res中。
                result.add(new int[]{start, mostRightBound});
                //并重新更新start,mostRightBound
                start = intervals[i][0];
                mostRightBound = intervals[i][1];
            }else{
                //当前左边界小于等于最大右边界,则直接在结果集中更新最大右边界
                mostRightBound = Math.max(mostRightBound, intervals[i][1]);
            }
        }
        result.add(new int[]{start, mostRightBound});
        return result.toArray(new int[result.size()][]);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值