目录
什么是贪心算法
贪婪算法(贪心算法)是指:在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。
贪心算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。
题目:分发饼干
思路分析:排序胃口和饼干尺寸,倒序遍历胃口值,此时最大的饼干能满足就+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
}
题目:柠檬水找零
思路分析:对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
}
题目:分发糖果
思路分析:正序遍历评分,首个=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
}