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
解答:
class Solution {
public:
vector<vector<int>> constructProductMatrix(vector<vector<int>>& grid) {
using ll = long long;
const int MOD = 12345;
int row_size = grid.size();
int col_size = grid[0].size();
int total = row_size * col_size;
vector<ll> q(total);
for (int i = 0; i < row_size; ++i) {
for (int j = 0; j < col_size; ++j) {
q[(i * col_size) + j] = grid[i][j];
}
}
vector<ll> prefix(total, 1);
vector<ll> suffix(total, 1);
vector<vector<int>> r(row_size, vector<int>(col_size));
for (int i = 1; i < total; ++i) {
prefix[i] = (prefix[i - 1] * q[i - 1]) % MOD;
}
for (int i = total - 2; i >= 0; --i) {
suffix[i] = (suffix[i + 1] * q[i + 1]) % MOD;
}
for (int i = 0; i < total; ++i) {
int v = (prefix[i] * suffix[i]) % MOD;
r[i / col_size][i % col_size] = v;
}
return r;
}
};