给定分别为N和M的两个数组row []和col [] ,任务是构造尺寸为N * M的矩阵,使得每第i行的矩阵元素之和为row [i]和矩阵之和第j列中的元素是col [j] 。
例子:
Input: row[] = {5, 7, 10}, col[] = {8, 6, 8}
Output: {{0, 5, 0}, {6, 1, 0}, {2, 0, 8}}
Explanation:
Row 1 has sum equal to 5 and column 1 has sum equal to 8
Row 2 has sum equal to 7 and column 2 has sum equal to 6
Row 3 has sum equal to 10 and column 3 has sum equal to 8
Input: row[] ={1, 0}, col[] = {1}
Output: {{1}, {0}}
Explanation:
Row 1 has sum equal to 1 and column 1 has sum equal to 1
Row 2 has sum 0
方法:解决此问题的最简单方法是使用贪婪方法。请按照以下步骤解决此问题:
- 初始化尺寸为N * M的矩阵。
- 通过以下方式开始填充矩阵的每个像元(i,j) :
- 对于每个单元格(i,j) ,选择row [i] , col [j]的最小值并将其放在单元格(i,j)上。让它成为minm 。
- 从row [i]和col [j]中减去minm 。
- 完成上述步骤后,打印形成的矩阵。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to generate a matrix with
// sum of each row equal to sum of r[]
// and sum of each column equal to sum of c[]
vector > restoreGem(
vector& r, vector& c)
{
// Initialize a matrix
vector > dp(r.size(),
vector(c.size(), 0));
// Traverse each cell (i, j) of the matrix
for (int i = 0; i < r.size(); i++) {
for (int j = 0; j < c.size(); j++) {
// Assign the minimum of the
// row or column value
int m = min(r[i], c[j]);
dp[i][j] = m;
// Subtract the minimum from
// both row and column sum
r[i] -= m;
c[j] -= m;
}
}
return dp;
}
void printMatrix(vector > ans,
int N, int M)
{
// Print the matrix obtained
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cout << ans[i][j] << " ";
}
cout << endl;
}
}
// Driver Code
int main()
{
vector rowSum = { 5, 7, 10 };
vector colSum = { 8, 6, 8 };
vector > ans
= restoreGem(rowSum, colSum);
printMatrix(ans, rowSum.size(),
colSum.size());
}
Java
// Java program for the above approach
import java.io.*;
class GFG
{
// Function to generate a matrix with
// sum of each row equal to sum of r[]
// and sum of each column equal to sum of c[]
static int[][] restoreGem(int[] r, int[] c)
{
// Initialize a matrix
int[][] dp = new int[r.length][c.length];
// Traverse each cell (i, j) of the matrix
for (int i = 0; i < r.length; i++)
{
for (int j = 0; j < c.length; j++)
{
// Assign the minimum of the
// row or column value
int m = Math.min(r[i], c[j]);
dp[i][j] = m;
// Subtract the minimum from
// both row and column sum
r[i] -= m;
c[j] -= m;
}
}
return dp;
}
static void printMatrix(int[][] ans,
int N, int M)
{
// Print the matrix obtained
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
System.out.print(ans[i][j] + " ");
}
System.out.println();
}
}
// Driver Code
public static void main(String[] args)
{
int[] rowSum = { 5, 7, 10 };
int[] colSum = { 8, 6, 8 };
int[][] ans
= restoreGem(rowSum, colSum);
printMatrix(ans, rowSum.length,
colSum.length);
}
}
// This code is contributed by susmitakundugoaldanga.
C#
// C# program for the above approach
using System;
public class GFG
{
// Function to generate a matrix with
// sum of each row equal to sum of r[]
// and sum of each column equal to sum of c[]
static int[,] restoreGem(int[] r, int[] c)
{
// Initialize a matrix
int[,] dp = new int[r.Length, c.Length];
// Traverse each cell (i, j) of the matrix
for (int i = 0; i < r.Length; i++)
{
for (int j = 0; j < c.Length; j++)
{
// Assign the minimum of the
// row or column value
int m = Math.Min(r[i], c[j]);
dp[i,j] = m;
// Subtract the minimum from
// both row and column sum
r[i] -= m;
c[j] -= m;
}
}
return dp;
}
static void printMatrix(int[,] ans,
int N, int M)
{
// Print the matrix obtained
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
Console.Write(ans[i, j] + " ");
}
Console.WriteLine();
}
}
// Driver Code
public static void Main(String[] args)
{
int[] rowSum = { 5, 7, 10 };
int[] colSum = { 8, 6, 8 };
int[,] ans
= restoreGem(rowSum, colSum);
printMatrix(ans, rowSum.Length,
colSum.Length);
}
}
// This code is contributed by 29AjayKumar
输出:
5 0 0
3 4 0
0 2 8
时间复杂度: O(N * M)
辅助空间: O(N * M)