leetcode1605. 给定行和列的和求可行矩阵
1链接:
链接:
2问题描述,示例,和提示:
3代码:
class Solution { public: vector<vector<int>> restoreMatrix(vector<int>& rowSum, vector<int>& colSum) { int row=rowSum.size(); int col=colSum.size(); vector<vector<int>> ret(row,vector<int>(col)); for(int i = 0;i<row;i++) { for(int j = 0;j<col;j++) { ret[i][j]=min(rowSum[i],colSum[j]); rowSum[i]-=ret[i][j]; colSum[j]-=ret[i][j]; } } return ret; } };
4题目解析及需要注意的
1.结果是有很多的
输入:rowSum = [5,7,10], colSum = [8,6,8] [[0,5,0], [6,1,0], [2,0,8]] [5,0,0] [3,4,0] [0,2,8]
2.解题思路
创建数组ret 核心思路:对于每个ret的节点,我们总是赋予他能承担的最大的值
3.解题步骤
r = [5,7,10], c= [8,6,8]//为了方便看,我就简化了命名 [5,0,0] [3,4,0] [0,2,8]
对于[0][0] 我们可以基于5(r[0])和8(c[0]),我们可以给定一个5,然后这一行就结束了 rowSum = [0,7,10], colSum = [3,6,8] 对于[1][0] 我们可以基于7(r[1])和3(c[0]),我们可以给定一个3,然后这一行还差4 rowSum = [0,4,10], colSum = [0,6,8] 对于[1][1] 我们可以基于4(r[1])和6(c[1]),我们可以给定一个4,然后这一行就结束了 rowSum = [0,0,10], colSum = [0,2,8] 对于[3][0] 我们可以基于0(r[3])和0(c[0]),我们可以给定一个0,然后这一行就结束了 rowSum = [0,0,10], colSum = [0,2,8] 对于[3][1] 我们可以基于10(r[3])和2(c[1]),我们可以给定一个2,然后这一行就结束了 rowSum = [0,0,8], colSum = [0,0,8] 最后一个位置是0
可以看到我们基于的数字,和填写的位置是直接对应的