LeetCode 1605. Find Valid Matrix Given Row and Column Sums【贪心,数组】中等
迪丽瓦拉
2025-05-29 06:17:01
0

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

You are given two arrays rowSum and colSum of non-negative integers where rowSum[i] is the sum of the elements in the ith row and colSum[j] is the sum of the elements of the jth column of a 2D matrix. In other words, you do not know the elements of the matrix, but you do know the sums of each row and column.

Find any matrix of non-negative integers of size rowSum.length x colSum.length that satisfies the rowSum and colSum requirements.

Return a 2D array representing any matrix that fulfills the requirements. It’s guaranteed that at least one matrix that fulfills the requirements exists.

Example 1:

Input: rowSum = [3,8], colSum = [4,7]
Output: [[3,0],[1,7]]
Explanation: 
0th row: 3 + 0 = 3 == rowSum[0]
1st row: 1 + 7 = 8 == rowSum[1]
0th column: 3 + 1 = 4 == colSum[0]
1st column: 0 + 7 = 7 == colSum[1]
The row and column sums match, and all matrix elements are non-negative.
Another possible matrix is: [[1,2],[3,5]]

Example 2:

Input: rowSum = [5,7,10], colSum = [8,6,8]
Output: [[0,5,0],[6,1,0],[2,0,8]]

Constraints:

  • 1 <= rowSum.length, colSum.length <= 500
  • 0 <= rowSum[i], colSum[i] <= 108
  • sum(rowSum) == sum(colSum)

题意:给出两个非负整数数组 rowSum 和 colSum ,其中 rowSum[i] 是二维矩阵中第 i 行元素的和, colSum[j] 是第 j 列元素的和。返回大小为 rowSum.length x colSum.length 的任意 非负整数 矩阵,且该矩阵满足 rowSum 和 colSum 的要求。题目保证存在 至少一个 可行矩阵。


解法 贪心

一开始可能很懵逼,但仔细想想就能发现答案。设答案矩阵为 ans ,则要给出 ans[i][j] 时,显然 ans[i][j] <= rowsum[i] && ans[i][j] <= colsum[j] ,即 ans[i][j] 最大为 min(rowsum[i], colsum[j]) 。我们的贪心策略是,按照从左到右、从上到下的顺序,给 ans[i][j] 填上当前可填的最大值。借用大佬做的图:

问题是:如何证明该构造方案一定能得到满足题目要求的矩阵?即使感觉上是可行的。
回答是:设生成的矩阵为 ans

  • 对于只有 111 行的情况,可知各列元素一定小于等于该行元素和即 colSum[j] <= rowSum[0] ,我们令 ans[0][j] = min(rowSum[0], colSum[j]) = colSum[j] 。由于题目保证 sum(rowSum) == sum(colSum) ,所以只有 111 行的 ans 可以满足题目要求。
  • 假设前 m−1m−1m−1 行的 ans 是满足题目要求的,剩下的是行和、列和数组分别是 rowSum, colSum 。上述构造方案可满足 ans 各列分别等于 colSum[j]ans 第 mmm 行的和等于 rowSum[m-1]
    只要 m−1m-1m−1 行的 ans 是满足题目要求的,那么第 mmm 行的 ans 也满足题目要求。 根据数学归纳法, mmm 行的 ans 是满足题目要求的
class Solution {
public:vector> restoreMatrix(vector& rowSum, vector& colSum) {int n = rowSum.size(), m = colSum.size();vector> ans(n, vector(m));for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {ans[i][j] = min(rowSum[i], colSum[j]);rowSum[i] -= ans[i][j];colSum[j] -= ans[i][j];}}return ans;}
};
  • 时间复杂度:O(mn)O(mn)O(mn)
  • 空间复杂度:O(mn)O(mn)O(mn)

还可继续优化。不难发现,我们取 min(rowSum[i], colSum[j]) 时,如果取到的是 rowSum[i] ,则该行的元素已经取完,这一行后面的元素只能取零;如果取到的是 colSum[j] ,则该列的元素已经取完,这一列后面的元素只能取零。这样理解也行:从左上角出发,每次要么去掉一行,要么去掉一列。同样根据数学归纳法,可以证明该做法的正确性。见图:
500

class Solution {
public:vector> restoreMatrix(vector& rowSum, vector& colSum) {int n = rowSum.size(), m = colSum.size();vector> ans(n, vector(m));for (int i = 0, j = 0; i < n && j < m;) {int rs = rowSum[i], cs = colSum[j];if (rs < cs) { // 取rowsum[i],去掉第i行,往下走colSum[j] -= rs;ans[i++][j] = rs;} else { // 去掉第j列,往右走rowSum[i] -= cs;ans[i][j++] = cs;}}return ans;}
};

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...