LeetCode //C - 1030. Matrix Cells in Distance Order
1030. Matrix Cells in Distance Order
You are given four integers row, cols, rCenter, and cCenter. There is a rows x cols matrix and you are on the cell with the coordinates (rCenter, cCenter).
Return the coordinates of all cells in the matrix, sorted by their distance from (rCenter, cCenter) from the smallest distance to the largest distance. You may return the answer in any order that satisfies this condition.
The distance between two cells ( r 1 , c 1 ) (r_1, c_1) (r1,c1) and ( r 2 , c 2 ) (r_2, c_2) (r2,c2) is ∣ r 1 − r 2 ∣ + ∣ c 1 − c 2 ∣ |r_1 - r_2| + |c_1 - c_2| ∣r1−r2∣+∣c1−c2∣.
Example 1:
Input: rows = 1, cols = 2, rCenter = 0, cCenter = 0
Output: [[0,0],[0,1]]
Explanation: The distances from (0, 0) to other cells are: [0,1]
Example 2:
Input: rows = 2, cols = 2, rCenter = 0, cCenter = 1
Output: [[0,1],[0,0],[1,1],[1,0]]
Explanation: The distances from (0, 1) to other cells are: [0,1,1,2]
The answer [[0,1],[1,1],[0,0],[1,0]] would also be accepted as correct.
Example 3:
Input: rows = 2, cols = 3, rCenter = 1, cCenter = 2
Output: [[1,2],[0,2],[1,1],[0,1],[1,0],[0,0]]
Explanation: The distances from (1, 2) to other cells are: [0,1,1,2,2,3]
There are other answers that would also be accepted as correct, such as [[1,2],[1,1],[0,2],[1,0],[0,1],[0,0]].
Constraints:
- 1 <= rows, cols <= 100
- 0 <= rCenter < rows
- 0 <= cCenter < cols
From: LeetCode
Link: 1030. Matrix Cells in Distance Order
Solution:
Ideas:
- Store every cell with its Manhattan distance to (rCenter, cCenter).
- Sort all cells by distance.
- Build the required int** result array.
Code:
typedef struct {
int r;
int c;
int dist;
} Cell;
static int cmp(const void *a, const void *b) {
Cell *x = (Cell *)a;
Cell *y = (Cell *)b;
return x->dist - y->dist;
}
/**
* 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 total = rows * cols;
*returnSize = total;
Cell *cells = (Cell *)malloc(sizeof(Cell) * total);
int idx = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cells[idx].r = i;
cells[idx].c = j;
cells[idx].dist = abs(i - rCenter) + abs(j - cCenter);
idx++;
}
}
qsort(cells, total, sizeof(Cell), cmp);
int **result = (int **)malloc(sizeof(int *) * total);
*returnColumnSizes = (int *)malloc(sizeof(int) * total);
for (int i = 0; i < total; i++) {
result[i] = (int *)malloc(sizeof(int) * 2);
result[i][0] = cells[i].r;
result[i][1] = cells[i].c;
(*returnColumnSizes)[i] = 2;
}
free(cells);
return result;
}
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐
所有评论(0)