美文网首页算法
1253. 重构 2 行二进制矩阵

1253. 重构 2 行二进制矩阵

作者: 红树_ | 来源:发表于2023-06-28 10:29 被阅读0次

LC每日一题,参考1253. 重构 2 行二进制矩阵,难度分1506。

题目

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

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

你需要利用 upperlowercolsum 来重构这个矩阵,并以二维整数数组的形式返回它。
如果有多个不同的答案,那么任意一个都可以通过本题。
如果不存在符合要求的答案,就请返回一个空的二维数组。

解题思路

  • 枚举贪心:考虑数据范围和题目要求,根据colsum的限制来枚举一列一列地填数,碰到 1 的时候看第一行和第二行的和哪个缺的多就填 1 。

class Solution {
    public List<List<Integer>> reconstructMatrix(int upper, int lower, int[] colsum) {
        int n = colsum.length;//n有10^5 暴力不行
        List<List<Integer>> ans = new ArrayList<>();
        //考虑一行 枚举列
        int[] u = new int[n],l = new int[n];
        int uSum = 0,lSum = 0;
        for(int i = 0; i < n ; i++) {
            int col = colsum[i];
            if(col == 2 || col == 0) {
                u[i] = l[i] = col/2;
                
            }else { //一个为零一个为1
                if(uSum < upper && lSum < lower) {
                    if(upper-uSum > lower-lSum) { //上面比较缺1
                        u[i] = 1;
                    }else {
                        l[i] = 1;
                    }
                }else if(uSum < upper){
                    u[i] = 1;
                }else if(lSum < lower) {
                    l[i] = 1;
                }else {
                    return ans;
                }
            }
            uSum += u[i];
            lSum += l[i];
        }
        if(uSum == upper && lSum == lower) {
            List<Integer> uList = new ArrayList<>(),lList = new ArrayList<>();
            for(int i : u) uList.add(i);
            for(int i : l) lList.add(i);
            ans.add(uList);
            ans.add(lList);
        }
        return ans;
    }
}

复杂度分析

  • 时间复杂度:O(n),一次遍历,ncolsum数组长度。
  • 空间复杂度:O(n),使用数组存储了结果加快了速度,也可以直接用队列O(1)。

相关文章

  • LeetCode #1253 Reconstruct a 2-R

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

  • 矩阵

    一、矩阵 A是3×2矩阵,即3行2列:矩阵的维数即行数×列数从0行0列开始。=6,A[1,1]=6:表示1行,1列...

  • 机器学习——线性代数

    一、矩阵和向量 这个是4×2矩阵,即4行2列,如m为行,n为列,那么m x n即为4×2 矩阵的维数即行数×列数 ...

  • 高斯消元法_线性代数_day29

    增广矩阵实现消元法 矩阵的某一行乘以一个常数 矩阵的一行加(减)另一行 交换矩阵的两行 例1: 例2: 先判断主元...

  • IOS 算法(基础篇) ----- 重塑矩阵

    给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。重构后的矩阵需要将原始矩...

  • 高等代数理论基础55:\lambda-矩阵在初等变换下的标准形

    -矩阵在初等变换下的标准形 初等变换 定义:-矩阵的初等变换 1.矩阵的两行(列)互换位置 2.矩阵的某一行(列)...

  • 图形变换原理(缩放、平移、拉伸、旋转)

    首先先理解数学中的矩阵乘法公式,在3行2列 * 2行?列,也就是第一个矩阵的列数和第二个矩阵的行数一定是相等。 请...

  • 初等矩阵_线性代数_day36

    矩阵的某一行乘以一个常数 矩阵的一行加减另外一行 矩阵的一行加减另外一行的若干倍 交换矩阵的两行 矩阵的初等变换,...

  • 2018-10-16 矩阵学习

    矩阵:矩阵块 矩阵的等价转化: 行阶梯形矩阵、行最简形矩阵、标准型矩阵: 初等矩阵: 超重要的推理:image.p...

  • 矩阵

    矩阵乘法:行乘列。 前一个矩阵行等于后一个矩阵列的两矩阵可相乘,结果为前项列乘以后项行矩阵。

网友评论

    本文标题:1253. 重构 2 行二进制矩阵

    本文链接:https://www.haomeiwen.com/subject/slynydtx.html