1030题:距离顺序排列矩阵单元格(桶排序)

本文介绍了一种解决矩阵单元格按距离排序问题的方法,利用桶排序策略,根据曼哈顿距离将单元格坐标进行分类并排序。适用于力扣LeetCode上的特定题目,通过遍历矩阵计算每个单元格与目标单元格的距离,将其放入对应距离的桶中,最后按桶的顺序返回排序后的坐标。

给出 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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值