贪心day5

435. 无重叠区间

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        //转化为找无重叠区间个数的问题
        //按右边界排序
        Arrays.sort(intervals, (o1, o2) -> {
            if (o1[1] == o2[1]) return Integer.compare(o2[0], o1[0]);
            return Integer.compare(o1[1], o2[1]);
        });
        //从左到右遍历找需要移除的区间
        int preEnd = intervals[0][1], n = 0;
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] >= preEnd) {
                preEnd = intervals[i][1];
            } else {
                n++;
            }
        }
        return n;
    }
}

763. 划分字母区间

class Solution {
    public List<Integer> partitionLabels(String s) {
        //遍历第一次 找出每个字母的最后一次出现的下标
        int[] lastAppear = new int[26];
        char[] array = s.toCharArray();
        for (int i = 0; i < array.length; i++) {
            lastAppear[array[i] - 'a'] = i;
        }
        //分割 根据该段中已有字母的最大右边界
        List<Integer> res = new ArrayList<>();
        int curIndexMax = -1, count = 0;
        for (int i = 0; i < array.length; i++) {
            curIndexMax = Math.max(curIndexMax, lastAppear[array[i] - 'a']);
            count++;
            if (i == curIndexMax) {
                res.add(count);
                count = 0;
            }
        }
        return res;
    }
}

参考:programmercarl.com

posted @ 2022-05-07 13:42  一梦两三年13  阅读(41)  评论(0)    收藏  举报