LeetCode 1253. 重构 2 行二进制矩阵

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

【LetMeFly】1253.重构 2 行二进制矩阵

力扣题目链接:https://leetcode.cn/problems/reconstruct-a-2-row-binary-matrix/

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

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

你需要利用 upperlower 和 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

方法一、方法二:分配(或贪心)

首先:

  • 如果colsum[i]为0,那么ans[0][i]和ans[1][i]必须为0
  • 如果colsum[i]为0,那么ans[0][i]和ans[1][i]必须为1

因此问题的关键就在于colsum[i]为1时如何分配(是令ans[0][i]为1还是ans[1][i]为1)

有两种方法:

  1. 对于所有colsum[i]为2的i,令ans[0][i] = ans[1][i] = 1,并统计upper和lower现在值为多少。接着对于colsum[i]为1的i,如果upper还没达到,就分配给ans[0][i],否则分配给ans[1][i],最终判断upper和lower是否同时满足
  2. 统计upper和lower还分别缺少多少个,当colsum[i]为2时lower和upper都分配,当colsum[i]为1时,分配给upper和lower中所需数量更大的那个

即可。

  • 时间复杂度 O ( l e n ( c o l s u m ) ) O(len(colsum)) O(len(colsum))
  • 空间复杂度 O ( 1 ) O(1) O(1) O ( l e n ( c o l s u m ) ) O(len(colsum)) O(len(colsum))(所返回答案的不计入算法空间复杂度)

AC代码

C++
class Solution {
public:
    vector<vector<int>> reconstructMatrix(int upper, int lower, vector<int>& colsum) {
        vector<vector<int>> ans(2, vector<int>(colsum.size(), 0));
        int cntUpper = 0, cntLower = 0;
        for (int i = 0; i < colsum.size(); i++) {
            if (colsum[i] == 2) {
                ans[0][i] = ans[1][i] = 1;
                cntUpper++, cntLower++;
            }
        }
        for (int i = 0; i < colsum.size(); i++) {
            if (colsum[i] == 1) {
                if (cntUpper < upper) {
                    ans[0][i] = 1;
                    cntUpper++;
                }
                else {
                    ans[1][i] = 1;
                    cntLower++;
                }
            }
        }
        if (cntUpper == upper && cntLower == lower) {
            return ans;
        }
        else {
            return {};
        }
    }
};
Python
from typing import List

class Solution:
    def reconstructMatrix(self, upper: int, lower: int, colsum: List[int]) -> List[List[int]]:
        ans = [[0] * len(colsum) for _ in range(2)]
        cntUpper, cntLower = 0, 0
        for i in range(len(colsum)):
            if colsum[i] == 2:
                ans[0][i] = ans[1][i] = 1
                cntUpper += 1
                cntLower += 1
        for i in range(len(colsum)):
            if colsum[i] == 1:
                if cntUpper < upper:
                    ans[0][i] = 1
                    cntUpper += 1
                else:
                    ans[1][i] = 1
                    cntLower += 1
        return ans if cntUpper == upper and cntLower == lower else []

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/131448811文章来源地址https://www.toymoban.com/news/detail-516493.html

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

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

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

相关文章

  • 力扣(leetcode)第696题计数二进制字串(Python)

    题目链接:696.计数二进制字串 给定一个字符串 s,统计并返回具有相同数量 0 和 1 的非空(连续)子字符串的数量,并且这些子字符串中的所有 0 和所有 1 都是成组连续的。 重复出现(不同位置)的子串也要统计它们出现的次数。 示例 1: 输入:s = “00110011” 输出:6 解释

    2024年01月20日
    浏览(10)
  • 2023-5-26 LeetCode每日一题(二进制矩阵中的最短路径)

    点击跳转到题目位置 给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1 。 二进制矩阵中的 畅通路径 是一条从 左上角 单元格(即,(0, 0))到 右下角 单元格(即,(n - 1, n - 1))的路径,该路径同时满足下述要求: 路径途

    2024年02月06日
    浏览(47)
  • java数据结构与算法刷题-----LeetCode1091. 二进制矩阵中的最短路径

    java数据结构与算法刷题-----LeetCode1091. 二进制矩阵中的最短路径

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 双分裂蛇:是求二维表中从起点到终点的经典思路(也是求无权图的最短路径问题的经典解法)。创建两条分裂蛇,分别从起点和

    2024年04月26日
    浏览(50)
  • 力扣67. 二进制求和算法

    力扣67. 二进制求和算法

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

    2024年01月16日
    浏览(12)
  • 力扣:67. 二进制求和(Python3)

    给你两个二进制字符串  a  和  b  ,以二进制字符串的形式返回它们的和。 来源:力扣(LeetCode) 链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 示例 1: 输入:a = \\\"11\\\", b = \\\"1\\\" 输出:\\\"100\\\" 示例 2: 输入:a = \\\"1010\\\", b = \\\"1011\\\" 输出:\\\"10101\\\" 转成十进制相加,再转回二进

    2024年02月12日
    浏览(9)
  • 改进二进制粒子群算法在配电网重构中的应用(Matlab实现)【论文复现】

    改进二进制粒子群算法在配电网重构中的应用(Matlab实现)【论文复现】

    目录  ​ 0 概述 1 配电网重构的目标函数 2 算例 3 matlab代码实现 配电系统中存在大量的分段开关和联络开关,配电网重构正是通过调整分段开关和联络升大的组合状态来变换网络结构,用于优化配电网某些指标,使其达到最优状态。正常运行时,则通过两类开关的不同组合状态

    2024年02月15日
    浏览(10)
  • leetcode-颠倒二进制位

    190. 颠倒二进制位 题解: 我们可以使用位运算来解决这个问题。具体步骤如下: 初始化一个变量res为0,用于存储颠倒后的二进制位。 循环32次,每次将n的最低位取出,并将其添加到res的最高位上。 将n右移一位,将res左移一位。 返回res作为最终结果。

    2024年01月25日
    浏览(50)
  • 【LeetCode】67. 二进制求和

    难度:简单 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1: 示例 2: 提示: 1 = a.length, b.length = 10^4 a 和 b 仅由字符 \\\'0\\\' 或 \\\'1\\\' 组成 字符串如果不是 \\\"0\\\" ,就不含前导零 思路: 从后往前遍历字符逐个判断即可 最后考虑是否进位 sum 1 等价于 sum

    2024年02月05日
    浏览(45)
  • Leetcode67 二进制求和

    Leetcode67 二进制求和

    给你两个二进制字符串  a  和  b  ,以二进制字符串的形式返回它们的和。      代码  

    2024年02月11日
    浏览(46)
  • leetcode: 2861. 最大二进制奇数

    给你一个 二进制 字符串  s  ,其中至少包含一个  \\\'1\\\'  。 你必须按某种方式 重新排列 字符串中的位,使得到的二进制数字是可以由该组合生成的 最大二进制奇数 。 以字符串形式,表示并返回可以由给定组合生成的最大二进制奇数。 注意 返回的结果字符串 可以 含

    2024年03月13日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包