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;
}
相关推荐
无敌昊哥战神4 小时前
【回溯算法巅峰之作】LeetCode 51. N皇后问题详解与常见避坑指南 (C/C++/Python)
c语言·算法·leetcode
UrSpecial4 小时前
基于C语言与Epoll的Reactor模型
c语言·网络编程·reactor·epoll
mftang4 小时前
BSS段、Data段、Text段的具体含义和数据特性
数据库·算法
王老师青少年编程4 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【反悔贪心】:建筑抢修
c++·算法·贪心·反悔贪心·csp·信奥赛·建筑抢修
TianFuRuanJian4 小时前
科普 | 仿真中的“体力活”:网格验证能不能自动化?
算法·仿真·ai网格
12.=0.4 小时前
【stm32_6.1】串行异步接口USART,串口的原理和应用
c语言·stm32·单片机·嵌入式硬件
leoufung5 小时前
LeetCode 135. Candy:从直觉到最优解的完整推导
算法·leetcode·职场和发展
啧不应该啊5 小时前
Day1 C与python输入输出语句区别
c语言·开发语言