day36 ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

本文将对三道经典的区间问题进行分析和解答,并给出Java的实现代码。这三道题分别是435. 无重叠区间、763. 划分字母区间和56. 合并区间。

    1. 无重叠区间

题目描述:给定一个区间的集合,找到最少的区间数量,使得它们的覆盖恰好覆盖整个区间集。

解题思路:这是一道经典的贪心问题,我们可以优先选择右端点较小的区间,这样可以在后续的选择中留下更多的空间。具体实现时,我们可以先将区间按照右端点从小到大排序,然后从前往后遍历,每次选择右端点最小的区间,然后将其右端点与后面的区间进行比较,如果有重叠,则删除右端点较大的那个区间。

Java代码实现:

public int eraseOverlapIntervals(int[][] intervals) {
    if (intervals.length == 0) {
        return 0;
    }
    Arrays.sort(intervals, (a, b) -> a[1] - b[1]); // 按右端点排序
    int count = 1, end = intervals[0][1];
    for (int i = 1; i < intervals.length; i++) {
        if (intervals[i][0] >= end) { // 无重叠
            count++;
            end = intervals[i][1];
        } // 有重叠,跳过
    }
    return intervals.length - count;
}
    1. 划分字母区间

题目描述:给定一个字符串,将它划分成尽可能多的区间,使得每个字母最多出现在一个区间中,求每个区间的长度。

解题思路:首先遍历一遍字符串,记录每个字母最后出现的位置。然后再遍历一遍字符串,记录当前区间的起始位置和结束位置,如果当前位置的字母最后出现的位置在当前区间内,则将当前区间扩展到该位置,否则将当前区间结束,并开启下一个区间。

Java代码实现:

public List<Integer> partitionLabels(String S) {
    int[] last = new int[26];
    for (int i = 0; i < S.length(); i++) {
        last[S.charAt(i) - 'a'] = i;
    }
    List<Integer> res = new ArrayList<>();
    int start = 0, end = 0;
    for (int i = 0; i < S.length(); i++) {
        end = Math.max(end, last[S.charAt(i) - 'a']);
        if (i == end) {
            res.add(end - start + 1);
            start = end + 1;
        }
    }
    return res;
}
    1. 合并区间

题目描述:给定一个区间的集合,合并所有重叠的区间。

解题思路:同样是一道经典的区间问题,我们可以先将所有区间按照左端点从小到大排序,然后从前往后遍历,每次将当前区间与下一个区间进行比较,如果有重叠,则合并两个区间。

Java代码实现:

public int[][] merge(int[][] intervals) {
    if (intervals.length == 0) {
        return new int[0][2];
    }
    Arrays.sort(intervals, (a, b) -> a[0] - b[0]); // 按左端点排序
    List<int[]> res = new ArrayList<>();
    int start = intervals[0][0], end = intervals[0][1];
    for (int i = 1; i < intervals.length; i++) {
        if (intervals[i][0] <= end) { // 有重叠,合并
            end = Math.max(end, intervals[i][1]);
        } else { // 无重叠,加入结果集
            res.add(new int[]{start, end});
            start = intervals[i][0];
            end = intervals[i][1];
        }
    }
    res.add(new int[]{start, end}); // 加入最后一个区间
    return res.toArray(new int[res.size()][]);
}

以上就是三道经典的区间问题的解答和Java代码实现。这些问题在面试和实际工作中都非常常见,掌握它们的解法和实现方法对于提升编程能力和解决实际问题都非常有帮助。

你可能感兴趣的:(刷题,算法,数据结构,java)