435.无重叠区间435.无重叠区间

70 阅读1分钟

435.无重叠区间

输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
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],intervals[i-1][1]);
                continue;
            }else{
                count++;
            }
        }
        //总区间数 - 移除后的区间数 = 需要移除的数量
        return intervals.length - count;
    }
}

763.划分字母区间

输入:s = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca""defegde""hijhklij" 。
每个字母最多出现在一个片段中

可以分为如下两步:

  • 统计每一个字符最后出现的位置
  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点 image.png
class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> list = new LinkedList<>();
        int[] edge = new int[26];
        //s转换成数组才能根据下标查找
        char[] chars = s.toCharArray();
        //每个字母在s中对应的最远下标
        for (int i = 0; i < chars.length; i++) {
            edge[chars[i] - 'a'] = i;
        }
        int index = 0;//别忘了初始化
        int last = -1;
        for (int i = 0; i < chars.length; i++){
            index = Math.max(index,edge[chars[i] - 'a']);
            //最远下标和i重合->分割点
            if(index == i){
                list.add(i - last);
                last = i;
            }
        }
        return list;
    }
}