先满足局部最优,最后导致全局最优
class Solution {
public int findContentChildren(int[] g, int[] s) {
/*采用贪心的思想
首先满足胃口最小的孩子的最小尺寸m的饼干;这样后面就有尺寸大的饼干能满足更多的孩子
假设有最右策略,分配给它尺寸n的饼干,n>m;根据贪心策略,
必然存在比n大的饼干尺寸,能够满足其他的孩子,所以贪心策略就是最优策略
排序两个数组
在第二个数组中,查找比一个个数组元素恰好大于等于的第一个数组元素个数*/
Arrays.sort(g);
Arrays.sort(s);
int gi=0;
int si=0;
while(gi<g.length&&si<s.length){
if(g[gi]<=s[si]){
gi++;
}
si++;
}
return gi;
}
}
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
class Solution {
public int eraseOverlapIntervals(Interval[] intervals) {
//Interval定义了一个区间
/*首先,找到满足不重叠的区间的最大个数,然后让区间总个数-该值
如何找到满足不重叠的区间的最大个数?
1.让区间的尾位置的元素最小,这样留给后面区间元素的选择性可能空间大;因此区间的总数就多
2.如何统计?
先按照区间尾元素进行排序,每次选择结尾最小的,然后找到不重叠的区间元素个数
*/
if(intervals.length==0) return 0;
int cnt=1;
Arrays.sort(intervals,new Comparator<Interval>(){
@Override
public int compare(Interval o1,Interval o2){
return o1.end-o2.end;
}
});
int minIndex=intervals[0].end;
for(int i=1;i<intervals.length;i++){
if(intervals[i].start<minIndex){
continue;
}
cnt++;
minIndex=intervals[i].end;
}
return intervals.length-cnt;
}
}