题目链接:https://leetcode-cn.com/contest/weekly-contest-162/problems/reconstruct-a-2-row-binary-matrix/
给你一个 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]]
提示:
1 <= colsum.length <= 10^5
0 <= upper, lower <= colsum.length
0 <= colsum[i] <= 2
题解
看了题目之后,我发现可以用回溯来做,然而并非如此。通过提示,我们可以看到数据是非常多的。达到了 \(10^5\),这说明这种方法是会超时的。仔细读题目后,看到了新的关键字。如果有多个不同的答案,任意一个即可。
数组 colsum
是很特别的,它的和就是我们要得到的矩阵的所有数据的和。而 upper
和 lower
的和也是矩阵的和。
因此,可以先来统计一下 1
和 2
的个数。
如果数据是合法的。再依次将 0
或 1
添加到链表中即可。
Java代码
/** * Description: Reconstruct a 2-Row Binary Matrix * Author: wowpH * Date: 2019-11-11 17:03:33 * From: https://www.cnblogs.com/wowpH/p/11836688.html */ class Solution { public List<List<Integer>> reconstructMatrix(int upper, int lower, int[] colsum) { int n = colsum.length; List<List<Integer>> ret = new ArrayList<>(); // 统计1,2的个数 int one = 0, two = 0; for (int i = 0; i < n; ++i) { if (1 == colsum[i]) { ++one; } else if (2 == colsum[i]) { ++two; } } // 检查参数是否合法 if (one + (two << 1) != upper + lower) { return ret; } // 提前去掉都是1的个数 upper -= two; lower -= two; if (upper < 0 || lower < 0) { return ret; } // 添加0,1到链表中 List<Integer> list1 = new ArrayList<>(); List<Integer> list2 = new ArrayList<>(); for (int i = 0; i < n; ++i) { if (0 == colsum[i]) { // 都添加0 list1.add(0); list2.add(0); } else if (2 == colsum[i]) { // 都添加1 list1.add(1); list2.add(1); } else { // 1个0,1个1 if (upper > 0) { // 链表1还可以添加1,优先满足链表1 list1.add(1); list2.add(0); --upper; } else { // 链表1已经不能添加1,向链表2添加1 list1.add(0); list2.add(1); --lower; } } } // 添加到结果链表中并返回结果 ret.add(list1); ret.add(list2); return ret; } }
原文链接:https://www.cnblogs.com/wowpH/p/11836688.html