题目链接:https://leetcode-cn.com/contest/weekly-contest-162/problems/reconstruct-a-2-row-binary-matrix/


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

矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 0 就是 1

0 行的元素之和为 upper

1 行的元素之和为 lower。

i 列(从 0 开始编号)的元素之和为 colsum[i]colsum 是一个长度为 n 的整数数组。

你需要利用 upperlowercolsum 来重构这个矩阵,并以二维整数数组的形式返回它。

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

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

示例 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 是很特别的,它的和就是我们要得到的矩阵的所有数据的和。而 upperlower 的和也是矩阵的和。

因此,可以先来统计一下 12 的个数。

如果数据是合法的。再依次将 01 添加到链表中即可。


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


- End -

LeetCode 1253. 重构 2 行二进制矩阵 - Java - 统计的更多相关文章

  1. LeetCode 1284. Minimum Number of Flips to Convert Binary Matrix to Zero Matrix (最少翻转次数将二进制矩阵全部置为0)

    给一个矩阵mat,每个格子都是0或1,翻转一个格子会将该格子以及相邻的格子(有共同边)全部翻转(0变为1,1变为0) 求问最少需要翻转几次将所有格子全部置为0. 这题的重点是数据范围,比赛结束看了眼数 ...

  2. LeetCode算法题-Flipping an Image(Java实现)

    这是悦乐书的第324次更新,第347篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第194题(顺位题号是832).给定二进制矩阵A,我们想要水平翻转图像,然后反转它,并返 ...

  3. Java匹马行天下之Java帝国的崛起(大结局)

    Java匹马行天下之Java帝国的崛起大结局 前言: [博客*缘] 网络真情伴, 博客友谊连. 笑中藏泪暖中寒. 回想那些悲喜, 苦涩也缠绵. 往事难回首, 新篇染旧言. 世间多少梦能全. 感谢相牵, ...

  4. # Leetcode 67:Add Binary(二进制求和)

    Leetcode 67:Add Binary(二进制求和) (python.java) Given two binary strings, return their sum (also a binar ...

  5. 命令行编译执行java

    命令行编译运行java程序 使用命令 javac进行编译 和 java进行执行. javac 后面跟着的是java文件的文件名,例如 HelloWorld.java. 该命令用于将 java 源文件编 ...

  6. LeetCode高频题目(100)汇总-Java实现

    LeetCode高频题目(100)汇总-Java实现       LeetCode高频题目(100)汇总-Java实现 目录 第01-50题 [Leetcode-easy-1] Two Sum [Le ...

  7. Java关于条件判断练习--统计一个src文件下的所有.java文件内的代码行数(注释行、空白行不统计在内)

    要求:统计一个src文件下的所有.java文件内的代码行数(注释行.空白行不统计在内) 分析:先封装一个静态方法用于统计确定的.java文件的有效代码行数.使用字符缓冲流读取文件,首先判断是否是块注释 ...

  8. 将行数据转换成Java(POJO)对象

    工作中经常会遇到将行数据转换成Java(POJO)对象的场景,其中关于字段校验和类型转换的处理繁琐而冗余,对于有代码洁癖的人着实不能忍.这里分享下自己封装的工具代码,也许能够帮助你更简单地完成此类任务 ...

  9. LeetCode 57. Insert Interval 插入区间 (C++/Java)

    题目: Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if nec ...

随机推荐

  1. AsyncAPI and CloudEvents

    一篇比较AsyncAPI与CloudEvents的文章,很不错,原文连接:https://www.asyncapi.com/blog/asyncapi-cloud-events/ I’ve been ...

  2. 链表 | 递归删除不带头结点链表所有x元素

    王道P37 T1 : 设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点. 王道上的答案绝对是错的,我自己想了一个 函数主体 LinkList* del_x(LinkList* prior, ...

  3. CCF 201803-3 URL映射

    CCF 201803-3  URL映射 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django. ...

  4. 【JZOJ6231】【20190625】等你哈苏德

    题目 有\(m\)条线段,每条线段为\([l_i,r_i]\),每条线段可以是黑/白色 有些线段已经被染色,有些需要被确定颜色 询问是否存在一种染色方案,使得对于每一个位置\(i\),覆盖它的线段黑白 ...

  5. 2019 SDN课程阅读作业(2)

    1.过去20年中可编程网络的发展可以分为几个阶段?每个阶段的贡献是什么? 主动网络(从1990年代中期到2000年代初) 它在网络中引入了可编程的功能以实现更多的创新: 20世纪90年代初,主动网络研 ...

  6. 【POJ1416】Shredding Company

    本题传送门 本题知识点:深度优先搜索 + 回溯 本题题意很简单,就是有一条位数不超过6的数字纸条,问你怎么剪这纸条,使得得到的纸条的值的总和最接近目标值(总和不能超过目标值). 比如第一个样例 50 ...

  7. IO多路复用之Reactor

    参考文档: http://blog.csdn.net/u013074465/article/details/46276967 https://www.cnblogs.com/ivaneye/p/573 ...

  8. 【Beta】发布说明

    再次号外!Visual Pytorch第二个版本上线了! 目前的网址在这里(http://114.115.151.39/) 哦 有关上一版本的功能介绍说明请参考博客:Visual Pytorch -- ...

  9. 美化自己的loading框

    美化自己的loading框 ._showloading { position: absolute; left:; width: 100%; height: 100%; top:; background ...

  10. t5_sumdoc.txt

    C:\Users\Administrator\Documents\sumdoc 2019\sumdoc t5 final\sumdoc t511C:\Users\Administrator\Docum ...