代码随想录算法训练营 day 36: ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

77 阅读1分钟

435. Non-overlapping Intervals

跟用箭射气球差不多。先按照start 排序,然后遍历并更新右边界。注意边界条件,头尾相接不算重叠。

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        int len = intervals.length;
        if(len == 1) {
            return 0;
        }

        Arrays.sort(intervals, (a,b)->{
            return Integer.compare(a[0], b[0]);
        });

        int count=0;

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

        }

        return count;
    }
}

763. Partition Labels 这题思路有了一半,结果越写越偏。 只保存同一个字母的最大右边界即可。保存所有的右边界写起来非常繁琐。

需要两个指针left和right更新当前区块的左右边界。

class Solution {
    public List<Integer> partitionLabels(String s) {
        int len = s.length();

        if(len == 1) {
            return new LinkedList<Integer>(Arrays.asList(1));
        }

        int[] hash = new int[26];

        for(int i=0; i<s.length(); i++) {
            hash[s.charAt(i) - 'a'] = i;
        }

        int left = 0;
        int right = 0;
        List<Integer> res = new LinkedList<Integer>();

        for(int i=0; i<s.length(); i++) {
            right = Math.max(right, hash[s.charAt(i) - 'a']);

            if(i==right) {
                res.add(right - left + 1);
                left = i+1;
            }
        }

        return res;
    }
}

56. Merge Intervals 也是跟射箭差不多,需要两个指针保存当前块的左右边界。 注意不要漏了最后那一块。

class Solution {
    public int[][] merge(int[][] intervals) {
        List<int[]> res = new LinkedList<>();

        int len = intervals.length;
        if(len == 1) {
            return intervals;
        }

        Arrays.sort(intervals, (a,b)->Integer.compare(a[0], b[0]));

        int start = intervals[0][0];
        int rightBand = intervals[0][1];

        for(int i=1; i<intervals.length; i++) {
            if(intervals[i][0] > rightBand) {
                res.add(new int[]{start, rightBand});
                start = intervals[i][0];
                rightBand = intervals[i][1];
            }
            else {
                rightBand = Math.max(rightBand, intervals[i][1]);
            }
        }

        res.add(new int[]{start, rightBand});
        return res.toArray(new int[res.size()][]);
    }
}