给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。
另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。
返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2)
之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/matrix-cells-in-distance-order
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题常用BFS或桶排序。
- 桶排序的应用场合是元素的值域分布明显,按照不同的值域将元素放进相应的桶中。
- 本题的“曼哈顿距离”,值域就是明显的0,1,2,3…R+C。
- 在桶内不要求排序的情况下,将以上值作为Key(桶),遍历矩阵存放坐标Value至对应Key,再升序遍历Key即可返回结果。
- 时间复杂度:O(R*C)
“桶排序”实现
import "math"
func allCellsDistOrder(R int, C int, r0 int, c0 int) [][]int {
if R == 1 && C == 1 {
return [][]int{{r0, c0}}
}
cellsmap := map[int][][]int{}
mandis := 0
for i := 0; i < R; i++ {
for j := 0; j < C; j++ {
mandis = int(math.Abs(float64(i-r0)) + math.Abs(float64(j-c0)))
cellsmap[mandis] = append(cellsmap[mandis], []int{i, j})
}
}
res := [][]int{}
for i := 0; ; i++ {
if _, ok := cellsmap[i]; ok {
for j := 0; j < len(cellsmap[i]); j++ {
res = append(res, cellsmap[i][j])
}
} else {
break
}
}
return res
}
本文介绍了一种解决矩阵单元格按距离排序问题的方法,利用桶排序策略,根据曼哈顿距离将单元格坐标进行分类并排序。适用于力扣LeetCode上的特定题目,通过遍历矩阵计算每个单元格与目标单元格的距离,将其放入对应距离的桶中,最后按桶的顺序返回排序后的坐标。
16万+

被折叠的 条评论
为什么被折叠?



