代码随想录35期Day35-Java

Day35题目

LeetCode435.无重叠区间:移除几个元素,使得不重叠

核心思想:排序区间之后,如果重叠,更新下一个区间的右边界为最小值.如果重叠了,最少移除其中一个,更新移除的那个为最小的右边界之后就不会影响到之后的区间判断

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        // 首先sort一下
        Arrays.sort(intervals,(a,b)->{
            return Integer.compare(a[0],b[0]);
        });
        int count = 0;
        for(int i = 1 ; i < intervals.length ;i ++){
            if(intervals[i-1][1] > intervals[i][0]){
                intervals[i][1] = Math.min(intervals[i][1],intervals[i-1][1]);
                count ++;
            }
        }
        return count;
    }
}

LeetCode763.划分字母

核心思想:获取字母的区间,然后如果遍历,遇到哪个字母右边界大于目前右边界,就更新遍历的终点.如果遍历到终点,说明这个区间内的所有包含的字母都只出现在目前这段区间内,我本来使用的map存储每一个区间,后面优化只用存储最后出现的地方就行了

class Solution {
    public List<Integer> partitionLabels(String s) {
        int[] hash = new int[27];
        List<Integer> res = new ArrayList<>();
        // 存储字母出现的最后一个位置
        for(int i = 0 ; i < s.length(); i ++){
            hash[s.charAt(i)-'a'] = i;
        }
        int start = -1;
        int end= hash[s.charAt(0)-'a'];
        for(int i = 0; i < s.length(); i ++){
            if(hash[s.charAt(i)-'a'] > end ){
                end = hash[s.charAt(i)- 'a'];
            }
            if(end == i){
                res.add(i-start);
                start = i;
            }
        }
        return res;
    }
}

LeetCode56.合并区间:合并区间使得其中没有重叠或者相邻的区间

核心思想:排序后遍历,遇到相重叠的区间,将最小左边界到最大右边界存到结果集

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals,(a,b)->{
            return a[0]-b[0];
        });
        List<int[]> res = new ArrayList<>();
        res.add(intervals[0]);
        for(int i = 1 ; i  < intervals.length ; i ++){
            if(res.getLast()[1] >= intervals[i][0] ){
                int[] temp = new int[]{res.getLast()[0],Math.max(intervals[i][1],res.getLast()[1])};
                // 如果这个和上一个重叠了,那么把上一个移除,加入合并后的区间
                res.removeLast();
                res.add(temp);
            }else{
                res.add(intervals[i]);
            }
        }
        return res.toArray(new int[res.size()][]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值