1094. 拼车

95 阅读1分钟

题目:
车上最初有 capacity 个空座位。车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向

给定整数 capacity 和一个数组 trips ,  trip[i] = [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客,接他们和放他们的位置分别是 fromi 和 toi 。这些位置是从汽车的初始位置向东的公里数。

当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false

算法:
方法一:差分数组

  1. 注意每次上车的乘客数是否超过capacity
  2. 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
}