贪心算法

贪心算法

算法描述

顾名思义,贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。

举一个最简单的例子:小明和小王喜欢吃苹果,小明可以吃五个,小王可以吃三个。已知苹果园里有吃不完的苹果,求小明和小王一共最多吃多少个苹果。在这个例子中,我们可以选用的贪心策略为,每个人吃自己能吃的最多数量的苹果,这在每个人身上都是局部最优的。又因为全局结果是局部结果的简单求和,且局部结果互不相干,因此局部最优的策略也同样是全局最优的策略。

分配问题

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;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值