请用Go实现力扣第855. 考场就座问题
时间: 2023-02-09 16:25:45 浏览: 137
MangoDowner#clear-leetcode#855.考场就座1
这道题的题意是:
给定一个由 `0` 和 `1` 组成的二维矩阵 `seats`,其中 `seats[i][j]` 表示第 `i` 行第 `j` 个座位是否可用。对于每一个学生,找出最接近他的空位,使得他可以坐下。如果有多个空位符合条件,则选择最左边的。返回每一个学生坐下的位置,以及他们与最近空位的距离之和。
这里给出一种用 Go 语言实现的方案:
```
type Student struct {
Row, Col int
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func assignBikes(seats [][]int) int {
m, n := len(seats), len(seats[0])
students := make([]Student, 0, m*n)
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if seats[i][j] == 1 {
students = append(students, Student{i, j})
}
}
}
ans := 0
for _, student := range students {
minDist := math.MaxInt32
minRow, minCol := -1, -1
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if seats[i][j] == 0 {
dist := abs(i-student.Row) + abs(j-student.Col)
if dist < minDist {
minDist = dist
minRow, minCol = i, j
} else if dist == minDist {
// 如果有多个空位符合条件,则选择最左边的
minCol = min(minCol, j)
}
}
}
}
seats[minRow][minCol] = 1
ans += minDist
}
return ans
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
```
算
阅读全文