贪心算法
算法描述
顾名思义,贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。
举一个最简单的例子:小明和小王喜欢吃苹果,小明可以吃五个,小王可以吃三个。已知苹果园里有吃不完的苹果,求小明和小王一共最多吃多少个苹果。在这个例子中,我们可以选用的贪心策略为,每个人吃自己能吃的最多数量的苹果,这在每个人身上都是局部最优的。又因为全局结果是局部结果的简单求和,且局部结果互不相干,因此局部最优的策略也同样是全局最优的策略。
分配问题
455.分发饼干
思路:将两个数组分别进行从小到大排序,为每一个小孩选择满足其胃口的最小饼干大小。
var findContentChildren = function(g, s) {
//首先给两个数组进行排序,这里采用从小到大的顺序
g.sort(function(value1,value2){
return value1-value2;
});
s.sort(function(value1,value2){
return value1-value2;
});
var sum=0;
//进行匹配
for(var i=0.;i<g.length;i++){
for(var j=0;j<s.length;j++){
if(g[i]<=s[j]){
sum++;//满足条件,则sum+1
s.splice(j,1);//若匹配成功,则在s中删除该数;反例:g=[2,2,3,4],s=[1,3,3,4],g[0]匹配s[1],g[1]匹配s[2],若在g[0]匹配成功后不删除s[1],那么g[1]将匹配到s[1].
break;
}
}
}
return sum;
};
135.分发糖果
思路:先给每个小朋友每人发一个糖果,为了满足“评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果”这一条件,我们可以从左至右和从右至左两个方向进行比较。
var candy = function(ratings) {
var a=new Array();//记录每个小朋友的糖果数
var sum=0;//记录糖果总数
for(var i=0;i<ratings.length;i++){//给每个小朋友各发一个糖果
a[i]=1;
}
for(var i=1;i<ratings.length;i++){//从左至右比较
if((ratings[i]>ratings[i-1]) && (a[i]<=a[i-1])){
a[i]=a[i-1]+1;//
}
}
for(var j=ratings.length-2;j>=0;j--){//从右至左比较
if((ratings[j]>ratings[j+1]) && (a[j]<=a[j+1])){
a[j]=a[j+1]+1;
}
}
/*解释一下,为什么在比较评分过程中还需要比较糖果数
例如:ratings=[1,3,4,5,2];
给每个小朋友各发一枚糖果后,此时a[5]=[1,1,1,1,1],从左至右比较后,a=[1,2,3,4,1];
从右至左比较时,若不对糖果数进行比较,则a=[1,2,3,2,1].
无法满足“评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果”这一条件
*/
for(var k=0;k < a.length;k++){
sum+=a[k];//糖果数求和
}
return sum;
};