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

leetcode 435 无重叠区间

题目链接

435. 无重叠区间 - 力扣(LeetCode)

做题过程

与452. 用最少数量的箭引爆气球类似,找到重叠区间即可。

解决方法

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        if (intervals.length == 0) return 0;
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));

        int count = 0;

        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] < intervals[i - 1][1]) {
                if (intervals[i][0] < intervals[i - 1][1]) {
                count++;
                intervals[i][1] = Math.min(intervals[i][1], intervals[i - 1][1]);
                }
            }
        }
        return count;
    }
}

leetcode 763 划分字母区间

题目链接

763. 划分字母区间 - 力扣(LeetCode)

做题过程

这道题目需要遍历两次。第一次遍历记录每个字母的最远距离。edge[chars[i] - ‘a’] = i即可记录。第二次遍历则划分。便利到这个区间内字母最远处即可。区间内的字母已经包含,下一个字母未包含。

解决方法

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 right = 0;
        int left = -1;
        for (int i = 0; i < chars.length; i++) {
            right = Math.max(right, edge[chars[i] - 'a']);
            if (i == right) {
                list.add(i - left);
                left = i;
            }
        }
        return list;
    }
}

leetcode 56 合并区间

题目链接

56. 合并区间 - 力扣(LeetCode)

做题过程

这道题目需要遍历两次。第一次遍历记录每个字母的最远距离。edge[chars[i] - ‘a’] = i即可记录。第二次遍历则划分。便利到这个区间内字母最远处即可。区间内的字母已经包含,下一个字母未包含。

解决方法

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 right = 0;
        int left = -1;
        for (int i = 0; i < chars.length; i++) {
            right = Math.max(right, edge[chars[i] - 'a']);
            if (i == right) {
                list.add(i - left);
                left = i;
            }
        }
        return list;
    }
}

你可能感兴趣的:(算法)