kim的每日刷题.LC.贪心算法

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;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值