Day29 - 贪心算法 part03

39 阅读2分钟

基础

刷题

  1. 加油站

leetcode.cn/problems/ga…

image.png

  1. 分发糖果

leetcode.cn/problems/ca…

思路:利用双指针cur, pre,从左向右,cur=1,cur和cur-1的孩子比较,ratings[cur] > ratings[cur-1],cur糖果数= cur-1糖果数+1, 如果等于,cur糖果数等于1,ratings[cur] < ratings[cur-1], cur糖果数=1,pre指针保留原地

如果孩子评分是5,4,3,2,1的情况,评分为5的孩子先发1个糖果,评分为4的孩子小于5,也发一个糖果,和pre作比较,如果相等,pre孩子糖果+1,以此类推

image.png

思路2: 从头遍历一遍,

if ratings[cur] > ratings[cur-1] { candy[cur] = candy[cur-1]+1 }else { candy[cur] = 1 }

从结尾遍历一遍,

if ratings[cur] > rating[cur+1] { candy[cur] = max(candy[cur], candy[cur+1]+1) }else { candy[cur] = max(candy[cur], 1) }

image.png

  1. 柠檬水找零

leetcode.cn/problems/le…

image.png

  1. 根据身高重建队列

leetcode.cn/problems/qu…

思路:把peaple按照身高从地到高,进行排列,一样高的按照ki从小到大排列,遍历排列好的people,新建一个result,把每一个人插入result中,每一个人从result开头计算等于null的元素数量为index,如果有一样高的元素记录在n[1]中,这样当index+n[1] == ki,就一定是这个人的result所在位置

image.png

解题思路:

把people按照身高从高到低,进行排列,一样高的按照ki从小到大排列,好处是先排序高的,在插入低的,不影响之前排列的顺序,但是插入时间比较耗时

image.png

image.png

总结

使用sort.Slice自定义排序

对于更复杂的类型或者你想要自定义排序逻辑,可以使用sort.Slice函数:



package main
 
import (
    "fmt"
    "sort"
)
 
func main() {
    people := []struct {
        Name string
        Age  int
    }{
        {"Bob", 31},
        {"John", 42},
        {"Michael", 17},
        {"Jenny", 26},
    }
 
    // 按年龄排序
    sort.Slice(people, func(i, j int) bool {
        return people[i].Age < people[j].Age
    })
    fmt.Println(people) // 按年龄排序的输出: [{Michael 17} {Jenny 26} {Bob 31} {John 42}]
}