题目:
车上最初有 capacity 个空座位。车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向)
给定整数 capacity 和一个数组 trips , trip[i] = [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客,接他们和放他们的位置分别是 fromi 和 toi 。这些位置是从汽车的初始位置向东的公里数。
当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false。
算法:
方法一:差分数组
- 注意每次上车的乘客数是否超过capacity
- to节点乘客下车了,可以上车乘客。先下后上。
这里车站数量只有1000,如果车站数量不定就要使用树状数组,动态开点了。
func carPooling(trips [][]int, capacity int) bool {
diff := make([]int, 1000)
for i := range trips {
if trips[i][0] > capacity {
return false
}
start, end := trips[i][1], trips[i][2]
diff[start] = diff[start] + trips[i][0]
if end < 1000 {
diff[end] = diff[end] - trips[i][0]
}
}
for i := 1; i < len(diff); i ++ {
diff[i] = diff[i - 1] + diff[i]
if diff[i] > capacity {
return false
}
}
return true
}
方法二:排序
按照下车位置,下车人数和上车位置,上车人数排序,实现先下后上,依次遍历,计算车上乘客数量
func carPooling(trips [][]int, capacity int) bool {
arr := make([][]int, len(trips) * 2)
pos := 0
for i := range trips {
arr[pos] = []int{trips[i][1], -trips[i][0]}
pos ++
arr[pos] = []int{trips[i][2], trips[i][0]}
pos ++
}
sort.Slice(arr, func(i, j int) bool {
if arr[i][0] == arr[j][0] {
return arr[i][1] > arr[j][1]
}
return arr[i][0] < arr[j][0]
})
c := capacity
for i := range arr {
c = c + arr[i][1]
if c < 0 {
return false
}
}
return true
}