Steward
分享是一種喜悅、更是一種幸福
程式語言 - LeetCode - C - 2906. Construct Product Matrix
參考資訊:
https://algo.monster/liteproblems/2906
題目:

方法:
// 原始公式 (位置0) = grid[0][1] * grid[1][0] * grid[1][1] (位置1) = grid[0][0] * grid[1][0] * grid[1][1] (位置2) = grid[0][0] * grid[0][1] * grid[1][1] (位置3) = grid[0][0] * grid[0][1] * grid[1][0] // 轉換成一維 (位置0) = grid[1] * grid[2] * grid[3] (位置1) = grid[0] * grid[2] * grid[3] (位置2) = grid[0] * grid[1] * grid[3] (位置3) = grid[0] * grid[1] * grid[2] // Prefix (由前往後) (位置0) = 1 (位置1) = grid[0] (位置2) = grid[0] * grid[1] (位置3) = grid[0] * grid[1] * grid[2] // Suffix (由後往前) (位置0) = grid[1] * grid[2] * grid[3] (位置1) = grid[2] * grid[3] (位置2) = grid[3] (位置3) = 1 // Result = Prefix * Suffix (位置0) = 1 * grid[1] * grid[2] * grid[3] (位置1) = grid[0] * grid[2] * grid[3] (位置2) = grid[0] * grid[1] * grid[3] (位置3) = grid[0] * grid[1] * grid[2] * 1
解答:
/**
* 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** constructProductMatrix(int** grid, int gridSize, int* gridColSize, int* returnSize, int** returnColumnSizes)
{
typedef long long ll;
const int MOD = 12345;
int i = 0;
int j = 0;
int row_size = gridSize;
int col_size = gridColSize[0];
int total = row_size * col_size;
ll *q = calloc(total, sizeof(ll));
ll *prefix = calloc(total, sizeof(ll));
ll *suffix = calloc(total, sizeof(ll));
int **r = calloc(row_size, sizeof(int *));
*returnSize = row_size;
*returnColumnSizes = calloc(row_size, sizeof(int));
for (i = 0; i < row_size; i++) {
r[i] = calloc(col_size, sizeof(int));
(*returnColumnSizes)[i] = col_size;
}
for (i = 0; i < total; i++) {
prefix[i] = 1;
suffix[i] = 1;
}
for (i = 0; i < row_size; i++) {
for (j = 0; j < col_size; j++) {
q[(i * col_size) + j] = grid[i][j];
}
}
for (i = 1; i < total; i++) {
prefix[i] = (prefix[i - 1] * q[i - 1]) % MOD;
}
for (i = total - 2; i >= 0; i--) {
suffix[i] = (suffix[i + 1] * q[i + 1]) % MOD;
}
for (i = 0; i < total; i++) {
int v = (prefix[i] * suffix[i]) % MOD;
r[i / col_size][i % col_size] = v;
}
return r;
}