leetcode 853. Car Fleet | 853. 车队(Golang)

x33g5p2x  于2022-02-12 转载在 Go  
字(0.9k)|赞(0)|评价(0)|浏览(286)

题目

https://leetcode.com/problems/car-fleet/

题解

看了答案

分析

我们首先对这些车辆按照它们的起始位置降序排序,并且用 (target - position) / speed 计算出每辆车在不受其余车的影响时,行驶到终点需要的时间。对于相邻的两辆车 S 和 F,F 的起始位置大于 S,如果 S 行驶到终点需要的时间小于等于 F,那么 S 一定会在终点前追上 F 并形成车队。这是因为在追上 F 之前,S 的行驶速度并不会减小,而 F 却有可能因为追上前面的车辆而速度减小,因此 S 总能在终点前追上 F。

算法

将车辆按照起始位置降序排序后,我们顺序扫描这些车辆。如果相邻的两辆车,前者比后者行驶到终点需要的时间短,那么后者永远追不上前者,即从后者开始的若干辆车辆会组成一个新的车队;如果前者不比后者行驶到终点需要的时间短,那么后者可以在终点前追上前者,并和前者形成车队。此时我们将后者到达终点的时间置为前者到达终点的时间。

代码

最近转 golang 了…

  1. type Car struct {
  2. pos int
  3. time float32
  4. }
  5. func carFleet(target int, position []int, speed []int) int {
  6. n := len(position)
  7. cars := make([]Car, n)
  8. for i := 0; i < n; i++ {
  9. cars[i].pos = position[i]
  10. cars[i].time = float32(target-position[i]) / float32(speed[i])
  11. }
  12. // sort by time
  13. sort.Slice(cars, func(i, j int) bool {
  14. return cars[i].pos > cars[j].pos
  15. })
  16. fmt.Println(cars)
  17. // 离得近、所需时间长 和 离的远、所需时间短 在一个车队
  18. result := 1
  19. preTime := cars[0].time
  20. for _, car := range cars {
  21. if car.time > preTime {
  22. result++
  23. preTime = car.time
  24. }
  25. }
  26. return result
  27. }

相关文章

最新文章

更多