Day27 | 425用最少数量的箭引爆气球&435无重叠区间&763划分字母区间&56合并区间

79 阅读2分钟

用最少数量的箭引爆气球 LeetCode 425

题目链接:[LeetCode 425 - 中等]

思路

Arrays.sort(points,(a,b)->Integer.compare(a[0],b[0]));只能使用Integer的compare方法,原因为[[-2147483646,-2147483645],[2147483646,2147483647]]的示例。

贪心:

class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points,(a,b)->Integer.compare(a[0],b[0]));

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

无重叠区间 LeetCode 435

题目链接:[LeetCode 435 - 中等]

思路

首先根据左边排序,然后取相交的集合中较小的一个数。

贪心:

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        int result = 0;
        Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));
        int pre = intervals[0][1];
        for(int i=1;i<intervals.length;i++){
            if(intervals[i][0]<pre){
                result++;
                pre=Math.min(intervals[i][1],pre);
            }else{
                pre = intervals[i][1];
            }
        }
        return result;
    }
}

划分字母区间 LeetCode 763

题目链接:[LeetCode 763 - 中等]

思路

1.edge数组的长度为26->表示为26个字母 2.判断该字母是否是最后一次出现,如果是,在list中记录。

贪心:

class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> list = new LinkedList<>();
        char[] chars = s.toCharArray();
        int[] edge = new int[26];
        for(int i=0;i<chars.length;i++){
            edge[chars[i]-'a']=i;
        }
        int idx = 0;
        int last = -1;
        for(int i=0;i<chars.length;i++){
            idx = Math.max(idx,edge[chars[i]-'a']);
            if(i==idx){
                list.add(i-last);
                last=i;
            }
        }
        return list;
    }
}

合并区间 LeetCode 56

题目链接:[LeetCode 56 - 中等]

思路

1.数组排序 2.更新判断重叠区间的右侧 3.最后再加入一组结果 4.如何将List<int[]>转化为int[][]

贪心:

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));
        List<int[]> list = new ArrayList<>();
        int left = intervals[0][0];
        int right = intervals[0][1];
        for(int i=1;i<intervals.length;i++){
            if(intervals[i][0]<=right){
                right = Math.max(right,intervals[i][1]);
            }else{
                list.add(new int[]{left,right});
                left = intervals[i][0];
                right = intervals[i][1];
            }
        }
        list.add(new int[]{left,right});
        return list.toArray(new int[list.size()][]);
    }
}