1030. 距离顺序排列矩阵单元格

地址:

力扣icon-default.png?t=LBL2https://leetcode-cn.com/problems/matrix-cells-in-distance-order/

题目:

给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。

另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。

返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)

示例 1:

输入:R = 1, C = 2, r0 = 0, c0 = 0
输出:[[0,0],[0,1]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1]


示例 2:

输入:R = 2, C = 2, r0 = 0, c0 = 1
输出:[[0,1],[0,0],[1,1],[1,0]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2]
[[0,1],[1,1],[0,0],[1,0]] 也会被视作正确答案。


示例 3:

输入:R = 2, C = 3, r0 = 1, c0 = 2
输出:[[1,2],[0,2],[1,1],[0,1],[1,0],[0,0]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2,2,3]
其他满足题目要求的答案也会被视为正确,例如 [[1,2],[1,1],[0,2],[1,0],[0,1],[0,0]]。

提示:

1 <= R <= 100
1 <= C <= 100
0 <= r0 < R
0 <= c0 < C

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/matrix-cells-in-distance-order
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

通过观察,给定坐标节点为距离 0 ,与之相邻的距离 1, 斜角距离 2

那么通过给定节点依序遍历,这种暴力方式太过于复杂,因为还要考虑查找到的元素是否存在

方法一、一维数组记录信息

以 R = 2, C = 3, r0 = 1, c0 = 2 为例:

    00 01 02

    10 11 12

一维数组的存放信息应该如下

        distance    idx_i       idx_j

        3           0           0

        2           0           1

        1           0           2

        2           1           0

        1           1           1

        0           1           2

   这样的好处是仅仅遍历一次就能知晓整个矩阵所偶元素的距离值,那么后续再拷贝回新矩阵时就很容易,从距离 0 开始拷贝

int **myMalloc(int r, int c, int *return_r, int **return_c)
{
	int **ret = (int **)malloc(sizeof(int *) * r);
	*return_r = r;
	
	*return_c =(int *)malloc(sizeof(int) * r); 
	for(int i=0; i<r; i++)
	{
		ret[i] = (int *)malloc(sizeof(int) * c);
		(*return_c)[i] = c;
	}

    return ret;
}

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** allCellsDistOrder(int rows, int cols, int rCenter, int cCenter, int* returnSize, int** returnColumnSizes){
	int r0 = rCenter;
	int c0 = cCenter;
	int r = rows * cols;
	int c = 2;
	int **ret = myMalloc(r, c, returnSize, returnColumnSizes);
	
	int i,j,k;
	
	/* 
	R = 2, C = 3, r0 = 1, c0 = 2
	00 01 02
	10 11 12
	
	array looks like:
		distance	idx_i		idx_j
		3			0			0
		2			0			1
		1			0			2
		2			1			0
		1			1			1
		0			1			2
	
	output to **ret, distance 0->1->2->3
	*/
	
	int array_len = (rows * cols) * 3;
	int *array = (int *)malloc(sizeof(int) * array_len);
	
	
	for(i=0, k=0; i<rows; i++)
	{
		for(j=0; j<cols; j++)
		{
			array[k++] = abs(i-r0) + abs(j-c0);
			array[k++] = i;
			array[k++] = j;
		}
	}
	
    i = 0;
	j = 0;
    int min = 0;
	int loopnum = rows * cols;
	while(loopnum)
	{
		//printf("loopnum=%d, min=%d\n", loopnum, min);
		for(k=0; k<array_len; k+=3)
		{
			//printf("array[%d][%d][%d]=[%d][%d][%d]\n", k, k+1, k+2, array[k], array[k+1], array[k+2]);
			if(array[k] == min)
			{
				//printf("------------>copy to ret..[%d][%d]\n", array[k+1], array[k+2]);
				if(i<r)
				{
					ret[i][j] = array[k+1];
					ret[i][j+1] = array[k+2];
					j += 2;
					if(j == c)
					{
						i++;
						j=0;
					}
				}
				
				loopnum--;
			}
		}
		
		min++;
	}
	
    free(array);

	return ret;
}

查看更多刷题笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值