基础
刷题
- 加油站
- 分发糖果
思路:利用双指针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,以此类推
思路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) }
- 柠檬水找零
- 根据身高重建队列
思路:把peaple按照身高从地到高,进行排列,一样高的按照ki从小到大排列,遍历排列好的people,新建一个result,把每一个人插入result中,每一个人从result开头计算等于null的元素数量为index,如果有一样高的元素记录在n[1]中,这样当index+n[1] == ki,就一定是这个人的result所在位置
解题思路:
把people按照身高从高到低,进行排列,一样高的按照ki从小到大排列,好处是先排序高的,在插入低的,不影响之前排列的顺序,但是插入时间比较耗时
总结
使用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}]
}