力扣 贪心专题

455. 分发饼干

https://leetcode-cn.com/problems/assign-cookies/submissions/
很简单。两个数组排序就O了

import java.lang.reflect.Array;
import java.util.Arrays;

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int ans=0,i=0,j=0;
        while(i<g.length && j<s.length){
            if(g[i]<=s[j]) {
                i++;
                j++;
                ans++;
            }
            else {
                j++;
            }
        }
        return ans;
    }
}

435. 无重叠区间

https://leetcode-cn.com/problems/non-overlapping-intervals/
可以转换成在一堆区间里找最多不重复的区间
思路为:
1.按右端点从小到大排序
2.从左到右能选的就选 即正确答案

import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[1]-o2[1];//右端点从小到大排序
            }
        });
        if(intervals.length==0) return 0;
        int res=1,r=intervals[0][1];
        //res为组成不重叠区间的最多个数 初值为1
       for(int i=1;i<intervals.length;i++){
            if(intervals[i][0]>=r){
                res++;//满足条件,res++
                r=intervals[i][1];
            }
        }
       //两者相减就是题目要求的删除个数
        return intervals.length-res;
    }
}

452. 用最少数量的箭引爆气球

可以转化为区间选点问题
https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons/description/

步骤为按右端点从小到大排序
从第一个区间开始,如果区间右端点覆盖了下一个区间就跳过
如果没覆盖则该区间为新的右端点
java自定义排序不是很熟,该题数据有负数不能使用-这种表达式了。

import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points, new Comparator<int[]>() {
            @Override
            public int compare(int[] point1, int[] point2) {
                if (point1[1] > point2[1]) {
                    return 1;
                } else if (point1[1] < point2[1]) {
                    return -1;
                } else {
                    return 0;
                }

            }
        });
        if(points.length==0) return 0;
        int res=1,x=points[0][1];
        for(int i=1;i<points.length;i++){
            if(x<points[i][0]) {
                x=points[i][1];
                res++;//没有覆盖就必须选择下一个区间作为右端点
            }
        }
        return res;
    }
}
posted @ 2021-02-28 15:01  一个经常掉线的人  阅读(69)  评论(0)    收藏  举报