当前位置: 代码迷 >> 综合 >> 【1253】重构2行矩阵
  详细解决方案

【1253】重构2行矩阵

热度:36   发布时间:2023-12-17 10:16:56.0

题目(难度:中等):

给你一个 2 行 n 列的二进制数组:

矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 0 就是 1。
第 0 行的元素之和为 upper。
第 1 行的元素之和为 lower。
第 i 列(从 0 开始编号)的元素之和为 colsum[i],colsum 是一个长度为 n 的整数数组。
你需要利用 upper,lower 和 colsum 来重构这个矩阵,并以二维整数数组的形式返回它。

如果有多个不同的答案,那么任意一个都可以通过本题。

如果不存在符合要求的答案,就请返回一个空的二维数组。

 

示例 1:

输入:upper = 2, lower = 1, colsum = [1,1,1]
输出:[[1,1,0],[0,0,1]]
解释:[[1,0,1],[0,1,0]] 和 [[0,1,1],[1,0,0]] 也是正确答案。
示例 2:

输入:upper = 2, lower = 3, colsum = [2,2,1,1]
输出:[]
示例 3:

输入:upper = 5, lower = 5, colsum = [2,1,2,0,1,0,1,2,0,1]
输出:[[1,1,1,0,1,0,0,1,0,0],[1,0,1,0,0,0,1,1,0,1]]

代码思想:

代码实现:

 public List<List<Integer>> reconstructMatrix(int upper, int lower, int[] colsum) {List<List<Integer>> res = new ArrayList<>();int up = upper, low = lower, sum = 0, len = colsum.length;for (int i = 0; i < len; i++) {if (colsum[i] == 2) {up--;low--;} else if (colsum[i] == 1) {sum++;}}if (up + low != sum || up < 0 || low < 0) {return res;}List<Integer> line1 = new ArrayList<>();List<Integer> line2 = new ArrayList<>();for (int i = 0; i < len; i++) {if (colsum[i] == 2) {line1.add(1);line2.add(1);} else if (colsum[i] == 0) {line1.add(0);line2.add(0);} else {if (up-- > 0) {line1.add(1);line2.add(0);} else {line1.add(0);line2.add(1);}}}res.add(line1);res.add(line2);return res;}

测试用例:

算法分析:

时间复杂度O(n),额外空间复杂度O(1)(两个list是题目要求必须申请的空间)