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:
c 复制代码
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;
}
相关推荐
?abc!24 分钟前
(动态规划+DFS)494. 目标和
算法·深度优先·动态规划
信奥卷王29 分钟前
[GESP202406 六级] 二叉树(含视频)
数据结构·算法
学逆向的34 分钟前
C 可变量参数
c语言·开发语言·网络安全
惊鸿一博1 小时前
Plücker直线_ 用两个三维向量描述一条空间直线
线性代数·算法·直线·几何表示
小道士写程序1 小时前
Rust 中的字符串与切片(String 与 &str)
算法
小莞尔1 小时前
【51单片机】【protues仿真】基于51单片机六路抢答器系统
c语言·单片机·嵌入式硬件·物联网·51单片机
圣保罗的大教堂1 小时前
leetcode 3863. 将一个字符串排序的最小操作次数 中等
leetcode
Tisfy1 小时前
LeetCode 3863.将一个字符串排序的最小操作次数:分类讨论(一次遍历)——简单易懂版
算法·leetcode·字符串·题解·分类讨论
Young Doro2 小时前
从平衡表征到最小充分因果表征:端到端神经网络因果效应估计
算法
0+1112 小时前
算法 --递归
算法·leetcode