​LeetCode解法汇总253. 重构 2 行二进制矩阵

news/2024/7/1 5:10:20

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

给你一个 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

解题思路:

* 解题思路:

* 题目本身不难,但是需要考虑的点还是比较多的。

* 首先分别用两个数组line1和line2记录第一行和第二行的值。

* 首先遍历一遍,如果遇到0,则跳过,遇到2,则两行各加1,并且相应的减少upper和lower的数量。

* 如果第一次遍历下来,lower和upper的数量少于0,则直接返回失败。

* 第二次遍历则找colsum[i]==1的情况,此时先减掉upper,等到upper=0则减lower。

* 最后看upper和lower的结果是否为0即可。

代码:

class Solution1253
{
public:
    vector<vector<int>> reconstructMatrix(int upper, int lower, vector<int> &colsum)
    {
        vector<vector<int>> result;
        vector<int> line1(colsum.size());
        vector<int> line2(colsum.size());

        for (int i = 0; i < colsum.size(); i++)
        {
            if (colsum[i] == 0)
            {
                line1[i] = 0;
                line2[i] = 0;
                continue;
            }
            if (colsum[i] == 2)
            {
                line1[i] = 1;
                line2[i] = 1;
                upper--;
                lower--;
            }
        }
        if (upper < 0 || lower < 0)
        {
            return result;
        }
        for (int i = 0; i < colsum.size(); i++)
        {
            if (colsum[i] != 1)
            {
                continue;
            }
            if (upper > 0)
            {
                upper--;
                line1[i] = 1;
                line2[i] = 0;
                continue;
            }
            if (lower > 0)
            {
                lower--;
                line1[i] = 0;
                line2[i] = 1;
                continue;
            }
            return result;
        }
        if (upper == 0 && lower == 0)
        {
            result.push_back(line1);
            result.push_back(line2);
            return result;
        }
        return result;
    }
};


http://lihuaxi.xjx100.cn/news/1292453.html

相关文章

vue3 使用KeepAlive缓存,多个路由使用同一个组件

项目使用KeepAlive缓存页面&#xff0c;页面内容根据参数来显示区分&#xff0c;所以出现多个路由指向同一个组件&#xff0c;缓存就不生效了。 解决思路 1、动态路由渲染时&#xff0c;给组件套一个空壳&#xff0c;设置不一样的name。2、动态路由渲染时&#xff0c;复制一个…

卷积基础知识总结

卷积层是卷积神经网络中的核心模块&#xff0c;**卷积层的目的是提取输入特征图的特征&#xff0c;**如下图所示&#xff0c;卷积核可以提取图像中的边缘信息。卷积也成为过滤器&#xff0c;即Filter 1 卷积的计算方法 卷积运算本质上就是在滤波器和输入数据的局部区域间做点…

csproj文件常用设置及C#注释常用写法

csproj文件常用设置及C#注释常用写法 .NET新版SDK风格的csproj文件 打开可为空警告 <PropertyGroup><Nullable>enable</Nullable> </PropertyGroup>启动全局引用using 下图没有任何using&#xff0c;仍然不报错 <PropertyGroup><Implicit…

vue加element-ui实现前端表格分页

如果不从后台请求数据&#xff0c;那么就需要在前端手动管理数据。可以使用以下步骤实现该功能&#xff1a; 在 Vue 组件的 data 中定义一个数组来存放所有数据&#xff08;不分页&#xff09;。 data() {return {allData: [], // 所有数据currentPage: 1, // 当前页数pageSi…

Java 引用传递

引用传递是 Java 中一个重要的概念&#xff0c;它与值传递不同&#xff0c;可以使得函数或方法可以修改传入的对象。本文将介绍 Java 中的引用传递&#xff0c;包括其定义、实现方式、与值传递的区别以及示例代码。 什么是引用传递 在 Java 中&#xff0c;变量可以存储基本类…

Character类(Java)

文章目录 1. 介绍2. 分析3. 方法3.1 isDigit()方法 --- isLetter()方法3.2 xxxx()方法3.2 xxxx()方法 1. 介绍 A. 类介绍&#xff1a;   Character 类在对象中包装一个基本类型 char 的值。Character 类型的对象包含类型为 char 的单个字段。 2. 分析 A. 类包结构&#xff1a…

centos磁盘扩容

解释 PE - 物理块&#xff08;Physical Extent&#xff09; 硬盘上有很多实际物理存在的存储块PV - 物理卷 &#xff08;Physical Volume&#xff09; 物理卷处于最底层&#xff0c;它可以是实际物理硬盘上的分区&#xff0c;也可以是整个物理硬盘(相当于单独做一个分区)&…

Bokeh 绘图基础与常用功能

Reference | Getting started with Bokeh – Medium Post 在 Github 上查看交互式的绘图结果 | Bokeh 绘图入门 – Posted by Paradise 在这篇文章中&#xff0c;从最基本的绘图开始&#xff0c;逐步学习 Bokeh 中常用的绘图功能&#xff0c;目标是能满足大部分基础的绘图需求。…