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

目录

  • 什么是贪心算法
  • 题目:分发饼干
    • 思路分析:排序胃口和饼干尺寸,倒序遍历胃口值,此时最大的饼干能满足就+1,不能就淘汰该胃口值
    • Go代码
  • 题目:柠檬水找零
    • 思路分析:对5/10美元计数,判断当前是5/10/20后,对计数进行增减,并判断5的计数<0则失败,否则成功找零
    • Go代码
  • 题目:分发糖果
    • 思路分析:正序遍历评分,首个=1,后比前大就+1,否则=1,再逆序遍历,前比后大就+1并保留新旧值的最大值
    • Go代码

什么是贪心算法

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

题目:分发饼干

题目链接:LeetCode-455. 分发饼干
[Go版]算法通关村第十七关青铜——原来贪心如此简单_第1张图片

思路分析:排序胃口和饼干尺寸,倒序遍历胃口值,此时最大的饼干能满足就+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. 柠檬水找零
[Go版]算法通关村第十七关青铜——原来贪心如此简单_第2张图片

思路分析:对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. 分发糖果
[Go版]算法通关村第十七关青铜——原来贪心如此简单_第3张图片

思路分析:正序遍历评分,首个=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
}

你可能感兴趣的:(算法与数据结构,算法)