Day 31 - Leetcode 435无重叠区间 | Leetcode 763划分字母区间 | Leetcode 56合并区间

文章目录

  • leetcode 435
  • leetcode 763
  • leetcode 56

leetcode 435

题目链接
求不重叠区间

思路

  • 重叠区间问题
  1. 按右边界排序
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> {
            return a[1] - b[1];
        });
        int num = 0;
        int end = intervals[0][1];
        for (int i = 1; i < intervals.length; ++i) {
            if (intervals[i][0] < end)
                ++num;
            else
                end = intervals[i][1];
        }
        return num;
    }
}
  1. 按左边界排序
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> {
            if (a[0] == b[0])
                return a[1] - b[1];
            return a[0] - b[0];
        });
        int num = 0;
        int end = intervals[0][1];
        for (int i = 1; i < intervals.length; ++i) {
            if (intervals[i][0] < end) {
                ++num;
                end = Math.min(end, intervals[i][1]);
            }
            else
                end = intervals[i][1];
        }
        return num;
    }
}

leetcode 763

题目链接
划分字符串,让重复字符只出现在某一个特定的区间内;
Like 假设字符串s被划分成s1,s2,s3,那么s1中的字母不会出现在s2

思路

  • 需要记录整个字符串s中每个元素出现的最大下标,最远位置
    • 字符串统计最大下标——想到 hash 相关题目中,用数组记录每个字母的出现频次等等类似的题目
  • 再次遍历s时,根据最大下标决定划分区间
class Solution {
    public List<Integer> partitionLabels(String s) {
        int[] pos = new int[26];
        for (int i = 0; i < s.length(); ++i)
            pos[s.charAt(i) - 'a'] = i;
        List<Integer> res = new LinkedList<>();
        int curEnd = 0;
        int curStart = 0; 
        for (int i = 0; i < s.length(); ++i) {
            curEnd = Math.max(pos[s.charAt(i) - 'a'], curEnd);
            if (i == curEnd) {
                res.add(i - curStart + 1);
                curStart = i + 1;
            }
        }
        return res;
    }
}

leetcode 56

题目链接
合并区间

思路

  • 比较简单,like leetcode 406
  • 注意用List来当作 Java 中的vector用,最后返回时再转换成二维数组的格式
class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> {
            return a[0] - b[0];
        });
        List<int[]> res = new LinkedList<>();
        int start = intervals[0][0], end = intervals[0][1];
        for (int i = 1; i < intervals.length; ++i) {
            if (intervals[i][0] <= end)   //can merge
                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()][]);
    }
}

你可能感兴趣的:(Leetcode,leetcode,算法,贪心算法)