kim终于要学习贪心算法啦啦啦;;;
LeetCode55:跳跃游戏;
若前面能达到的最远距离都小于当前点,那么当前点及后面的点就都不可达——力扣大神;
大神,我悟了!;
public boolean canJump(int[] nums) {
int far = 0;
for(int i = 0; i < nums.length; i++) {
if(i>far) return false; #达到不了当前位置(过程中的某个位置)
far = Math.max(far, i+nums[i]); #目前可以到达的最远处
if(far>=nums.length-1) break; #可以到达最后处
}
return true;
}
LeetCode455:分发饼干;
先将胃口g和饼干size排好序,然后按顺序先满足胃口小的孩子,这样才能尽可能多的满足孩子;
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int kid = 0;
for(int i = 0; i < s.length && kid < g.length; i++) #防溢出
if(s[i]>=g[kid]) #刚好可以满足这个孩子的饼干size
kid++;
return kid;
}
LeetCode435:区间调度问题;
先对end结束时间排序,按顺序取出课程,同时删除与之冲突的课程,直至遍历结束;
public static int eraseOverlapIntervals(int[][] intervals) {
if(intervals.length==0) return 0; #只能判断长度是否为0,不能判断是否为null
Arrays.sort(intervals, new Comparator<int[]>() { #对二维数组的第二列元素排序
public int compare(int[] a, int[] b) {
return a[1] - b[1];
}
});
int end = intervals[0][1]; #没冲突调度下(当前)结束时间
int noOverlap = 1; #没有重叠的课程数目
for(int i = 1; i < intervals.length; i++) {
if(intervals[i][0]>=end) { #遇到新的没有重叠的课程,添加!
end = intervals[i][1];
noOverlap++;
}
}
return intervals.length-noOverlap; #总的减去没有重叠的就是重叠的,需要删除的
}
LeetCode452:用最少数量的箭引爆气球;
类似区间调度问题,先对结束点排序,取一个气球,遇到没有重叠的气球就够不着了,需要多一支箭;
class Solution {
public int findMinArrowShots(int[][] points) {
if(points.length==0) return 0;
Arrays.sort(points, new Comparator<int[]>() {
public int compare(int[] a, int[] b) {
long comp = (long)a[1]-(long)b[1]; #防溢出
if(comp > 0) return 1;
else if(comp == 0) return 0;
else return -1;
}
});
int end = points[0][1];
int overlap = 1;
for(int i = 1; i < points.length; i++) {
if(end<points[i][0]) { #够不着了,就要多射一支箭
end = points[i][1];
overlap++;
}
}
return overlap;
}
}