LeetCode Day36 435&763&56

19 阅读1分钟
435. 无重叠区间

这题和气球那题有点像。弓箭的数量就相当于是非交叉区间的数量,只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后用总区间数减去弓箭数量 就是要移除的区间数量了。

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> {
            return Integer.compare(a[0], b[0]);
        });
        int count = 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{
                count ++;
            }
        }

        return intervals.length - 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;
    }
}
56. 合并区间

这题也是判断区间重叠,判断区间重叠后要进行区间合并。判断的方法是对数组进行排序然后寻找边界,合并的过程就是找出区间的左边界和右边界,这样形成一个新区间然后就可以加入到result数组里了。

class Solution {
    public int[][] merge(int[][] intervals) {
        LinkedList<int[]> res = new LinkedList<>();
        Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));
        res.add(intervals[0]);
        for(int i = 1; i < intervals.length; i ++){
            if(intervals[i][0] <= res.getLast()[1]){
                int start = res.getLast()[0];
                int end = Math.max(intervals[i][1], res.getLast()[1]);
                res.removeLast();
                res.add(new int[]{start, end});
            } else{
                res.add(intervals[i]);
            }
        }

        return res.toArray(new int[res.size()][]);
    }
}