[Go版]算法通关村第十七关青铜——原来贪心如此简单

什么是贪心算法

贪婪算法(贪心算法)是指:在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。
贪心算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。

题目:分发饼干

题目链接:LeetCode-455. 分发饼干
在这里插入图片描述

思路分析:排序胃口和饼干尺寸,倒序遍历胃口值,此时最大的饼干能满足就+1,不能就淘汰该胃口值

Go代码

func findContentChildren(g []int, s []int) int {
    sort.Ints(g)
    sort.Ints(s)
    num := 0
    leng := len(g)
    lens := len(s)
    if lens == 0 || leng == 0 {
        return 0
    }
    for i:=leng-1;i>=0;i-- {
        if g[i] <= s[lens-1] {
            lens--
            num++
        }
        if lens == 0 {
            break
        }
    }
    return num
}

题目:柠檬水找零

题目链接:LeetCode-860. 柠檬水找零
在这里插入图片描述

思路分析:对5/10美元计数,判断当前是5/10/20后,对计数进行增减,并判断5的计数<0则失败,否则成功找零

Go代码

func lemonadeChange(bills []int) bool {
    bill5 := 0
    bill10 := 0
    for _, v := range bills {
        if v == 5 {
            bill5++
        }
        if v == 10 {
            bill5--
            bill10++
        }
        if v == 20 {
            if bill10 > 0 {
                bill10--
                bill5--
            } else {
                bill5 -= 3
            }
        }
        if bill5 < 0 {
            return false
        }
    }
    return true
}

题目:分发糖果

题目链接:LeetCode-135. 分发糖果
在这里插入图片描述

思路分析:正序遍历评分,首个=1,后比前大就+1,否则=1,再逆序遍历,前比后大就+1并保留新旧值的最大值

Go代码

func candy(ratings []int) int {
    length := len(ratings)
    if length == 0 {
        return 0
    }
    arr := make([]int, length)
    arr[0] = 1
    // 正序遍历分发一次
    for i:=1; i<=length-1; i++ {
        if ratings[i] > ratings[i-1] {
            arr[i] = arr[i-1]+1
        } else {
            arr[i] = 1
        }
    }
    sum := arr[length-1]
    // 逆序遍历分发一次
    for i:=length-2; i>=0; i-- {
        if ratings[i] > ratings[i+1] {
            arr[i] = GetMax(arr[i], arr[i+1]+1)
        }
        sum += arr[i]
    }
    return sum
}

func GetMax(a, b int) int {
    if a>b {
        return a
    }
    return b
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值