import "sort"
// 860. 柠檬水找零
func lemonadeChange(bills []int) bool {
//如果最开始就大于5元,肯定无法找零直接返回false
if len(bills) > 0 && bills[0] > 5 {
return false
}
five := 0
ten := 0
twenty := 0
for i := 0; i < len(bills); i++ {
//等于5元直接收下不用找零,five++
if bills[i] == 5 {
five++
//如果是10元,且有5元可以找零
} else if bills[i] == 10 && five > 0 {
ten++
five--
} else if bills[i] == 20 && five > 0 {
//如果是20元,可以找10元+5元或者3个五元,优先采用10+5方式
if ten > 0 {
twenty++
ten--
five--
} else {
if five < 3 {
return false
}
five -= 3
}
//如果没有五元找零,直接返回false
} else if five == 0 && (bills[i] == 10 || bills[i] == 20) {
return false
}
}
return true
}
func reconstructQueue(people [][]int) [][]int {
sort.Slice(people, func(i, j int) bool {
if people[i][0] == people[j][0] { //如果身高相等则按照k从小到大排序
return people[i][1] < people[j][1]
}
return people[i][0] > people[j][0] //身高由大到小排序
})
// 再按照K进行插入排序,优先插入K小的
for i := 0; i < len(people); i++ {
p := people[i]
copy(people[p[1]+1:i+1], people[p[1]:i+1])
people[p[1]] = p
}
return people
}
func findMinArrowShots(points [][]int) int {
if len(points) == 0 {
return 0
}
arrow := 1 //弓箭数量
//按第一位从小到大排序
sort.Slice(points, func(i, j int) bool {
return points[i][0] < points[j][0]
})
for i := 1; i < len(points); i++ {
//如果前一个右边界比当前左边界小说明无法一起射破,需要增加一支箭
if points[i-1][1] < points[i][0] {
arrow++
} else {
// 如果当前边界比之前边界大,则沿用之前边界
if points[i][1] > points[i-1][1] {
points[i][1] = points[i-1][1]
}
}
}
return arrow
}