【算法】Reconstruct a 2-Row Binary Matrix 重构 2 行二进制矩阵

这篇具有很好参考价值的文章主要介绍了【算法】Reconstruct a 2-Row Binary Matrix 重构 2 行二进制矩阵。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Reconstruct a 2-Row Binary Matrix 重构 2 行二进制矩阵

问题描述:

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

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

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

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

1 < = c o l s u m . l e n g t h < = 1 0 5 0 < = u p p e r , l o w e r < = c o l s u m . l e n g t h 0 < = c o l s u m [ i ] < = 2 1 <= colsum.length <= 10^5\\ 0 <= upper, lower <= colsum.length\\ 0 <= colsum[i] <= 2 1<=colsum.length<=1050<=upper,lower<=colsum.length0<=colsum[i]<=2

k , n u m s . l e n g t h 范围 [ 1 , 16 ] , n u m s . l e n g t h k ,nums.length 范围[1,16 ] ,nums.length%k==0 ,nums[i] 范围[1,nums.length ] k,nums.length范围[1,16],nums.length

分析

目标是构建出一个2行的二进制数组,并且第一行的 s u m 1 = u p p e r sum1=upper sum1=upper,第二行的 s u m 2 = l o w e r sum2=lower sum2=lower.并且2行相同位置的加和 a r r 1 [ i ] + a r r 2 [ i ] = = c o l s u m [ i ] arr1[i]+arr2[i]==colsum[i] arr1[i]+arr2[i]==colsum[i].

当然也可能无法构建符合给定条件的数组

假设存在这样的目标数组arr,那么必须满足
第一个限制
∑ 0 < = k < = n ( a r r 1 [ k ] + a r r 2 [ k ] ) = u p p e r + l o w e r . \sum_{0<=k<=n}(arr1[k]+arr2[k])= upper+lower. 0<=k<=n(arr1[k]+arr2[k])=upper+lower.

此外就要看数据是否能够分配合理,观察可以知道,当 c o l s u m [ i ] = = 0 o r 2 colsum[i]==0 or 2 colsum[i]==0or2,可以确定 a r r [ i ] arr[i] arr[i]的数值,即同0,2.
所以另一个限制就是 c o l s u m colsum colsum 2 2 2出现的次数.
c n t 2 < = min ⁡ ( u p p e r , l o w e r ) . cnt2<=\min(upper,lower). cnt2<=min(upper,lower).

所以当上述2个条件都满足的情况下,是完全可以构造成功。

策略贪心

u p p e r , l o w e r upper,lower upperlower都减掉 c n t 2 cnt2 cnt2,即2出现的次数,剩余的就是各行1出现的次数。
所以当 c o l s u m [ i ] = = 1 colsum[i]==1 colsum[i]==1,可以先放行1,当 u p p e r upper upper降低为0,就可以把剩余的都放入行2

代码

class Solution {
    public List<List<Integer>> reconstructMatrix(int upper, int lower, int[] colsum) {
        int n = colsum.length;
        int sum = 0, two = 0;
        for (int i = 0; i < n; ++i) {
            if (colsum[i] == 2) {
                ++two;
            }
            sum += colsum[i];
        }
        if (sum != upper + lower || Math.min(upper, lower) < two) {
            return new ArrayList<List<Integer>>();
        }
        upper -= two;
        lower -= two;
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        for (int i = 0; i < 2; ++i) {
            res.add(new ArrayList<Integer>());
        }
        for (int i = 0; i < n; ++i) {
            if (colsum[i] == 2) {
                res.get(0).add(1);
                res.get(1).add(1);
            } else if (colsum[i] == 1) {
                if (upper > 0) {
                    res.get(0).add(1);
                    res.get(1).add(0);
                    --upper;
                } else {
                    res.get(0).add(0);
                    res.get(1).add(1);
                }
            } else {
                res.get(0).add(0);
                res.get(1).add(0);
            }
        }
        return res;
    }
}
 

时间复杂度 O ( N ) O(N) O(N)

空间复杂度 O ( 1 ) O(1) O(1)

Tag

Matrix
Greedy文章来源地址https://www.toymoban.com/news/detail-526484.html

到了这里,关于【算法】Reconstruct a 2-Row Binary Matrix 重构 2 行二进制矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Elasticsearch教程6】Mapping字段类型之二进制binary

    binary类型接收一个Base64编码的字符串,默认情况二进制字段 不能被存储和检索 。 binary不能被存储? 这个意思不是说没有存储在ES,而是说mapping中该字段的store参数默认是false。 默认情况下字段的值都会存储到 _source 里, binary 类型的值也是如此。 如果 store 属性设置为true,

    2024年02月05日
    浏览(56)
  • 将Swift Package构建为通用二进制文件 Universal Binary

      因此,在苹果在WWDC 2020期间宣布他们将把Mac从英特尔处理器过渡到苹果硅之后,现在是时候让每个人都准备好他们的软件了。 对大多数人来说,这次过渡可能更容易一些,特别是那些已经在iOS上支持arm64的人,但仍有工作要做,以确保工具和预编译的发行版支持使用Apple

    2024年02月11日
    浏览(46)
  • LeetCode 1253. 重构 2 行二进制矩阵

    力扣题目链接:https://leetcode.cn/problems/reconstruct-a-2-row-binary-matrix/ 给你一个  2  行 n 列的二进制数组: 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是  0  就是  1 。 第 0 行的元素之和为  upper 。 第 1 行的元素之和为 lower 。 第 i 列(从 0 开始编号)的元素之和为

    2024年02月11日
    浏览(41)
  • 【每日一题】1253. 重构 2 行二进制矩阵

    给你一个 2 行 n 列的二进制数组: 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 0 就是 1。 第 0 行的元素之和为 upper。 第 1 行的元素之和为 lower。 第 i 列(从 0 开始编号)的元素之和为 colsum[i],colsum 是一个长度为 n 的整数数组。 你需要利用 upper,lower 和 colsu

    2024年02月12日
    浏览(45)
  • ​LeetCode解法汇总253. 重构 2 行二进制矩阵

    https://github.com/September26/java-algorithms 给你一个  2  行  n  列的二进制数组: 矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是  0  就是  1 。 第  0  行的元素之和为  upper 。 第  1  行的元素之和为  lower 。 第  i  列(从  0  开始编号)的元素之和为  colsum[i] ,

    2024年02月11日
    浏览(49)
  • 图文结合带你搞懂MySQL日志之Binary log(二进制日志)

    往期回顾 图文结合带你搞定MySQL日志之Undo log(回滚日志) 图文结合带你搞懂InnoDB MVCC 图文结合带你搞懂MySQL日志之Redo Log(重做日志) 图文结合带你搞懂MySQL日志之Error Log(错误日志) 图文结合带你搞懂MySQL日志之Slow Query Log(慢查询日志) 图文结合带你搞懂MySQL日志之relay log(中

    2024年02月07日
    浏览(68)
  • MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点1:二进制日志文件(Binary log)

    【免责声明】文章仅供学习交流,观点代表个人,与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) MySQL中有多种类型的日志文件,这些日志可用于故障排除、性能调整和审计等目的,帮助找出正在发生的活动。 常见的日志文件包括: 日志类型 写入日志的信息 错误日志(

    2024年02月16日
    浏览(60)
  • 力扣67. 二进制求和算法

    这道题需要,给你两个字符串比如 答案是:\\\"10101\\\" 然后需要你给出计算结果,那么我们很容易想到两种做法 1. 调库做法:直接转化为整数,然后用内置函数做进制转换直接计算出结果 2. 计算做法:将十进制思维移植过来,对每一位加并且做carry操作,最后得出结果 笔者最初

    2024年01月16日
    浏览(45)
  • 【算法题】67. 二进制求和

    给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1: 输入:a = \\\"11\\\", b = \\\"1\\\" 输出:\\\"100\\\" 示例 2: 输入:a = \\\"1010\\\", b = \\\"1011\\\" 输出:\\\"10101\\\" 提示: 1 = a.length, b.length = 10^4 a 和 b 仅由字符 \\\'0\\\' 或 \\\'1\\\' 组成 字符串如果不是 \\\"0\\\" ,就不含前导零

    2024年01月23日
    浏览(76)
  • 二进制算法题+回文链表

    先计算两个字符串公共的部分,需要维护三个变量:两个数组的指针idx+一个进位变量up 注意,这里用StringBuffer来存储结果,先存储的是个位,所以最后需要reverse一下。 21分钟 如何看一个字符是否在变化?维护一个temp变量来记录他上一次的结果。 模拟十进制转二进制:先对

    2024年02月07日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包