力扣 贪心专题
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;
}
}

浙公网安备 33010602011771号