【每日一题Day250】LC1253重构 2 行二进制矩阵 | 贪心模拟

简介: 【每日一题Day250】LC1253重构 2 行二进制矩阵 | 贪心模拟

重构 2 行二进制矩阵【LC1253】

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

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

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

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

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

思路

如果colsum中某个位置为2,那么两行中该位置都为1;如果某个位置为1,那么设置任意一行为1,另一行为0。因此可以先将一定是1的位置赋值为1,并计算需要赋值为1的位置和 upper、lower中剩余的数目是否相等,如果不相等,那么表示不可构造。否则,我们可以构造出该数组,由于只需要返回一个可能的答案,那么先将upper赋值为1,再将lower赋值为1

实现

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

复杂度

  • 时间复杂度:O ( n l o g n )
  • 空间复杂度:O(n)
目录
相关文章
|
9月前
【每日一题Day292】LC1572矩阵对角线元素的和 模拟
【每日一题Day292】LC1572矩阵对角线元素的和 模拟
36 0
|
9月前
【每日一题Day268】LC415字符串相加 | 模拟
【每日一题Day268】LC415字符串相加 | 模拟
61 0
|
9月前
【每日一题Day210】LC1073负二进制数相加 | 模拟
【每日一题Day210】LC1073负二进制数相加 | 模拟
44 0
|
9月前
|
机器学习/深度学习
【每日一题Day263】LC2544交替数字和 | 数学
【每日一题Day263】LC2544交替数字和 | 数学
56 0
|
9月前
【每日一题Day342】LC2578最小和分割 | 贪心
【每日一题Day342】LC2578最小和分割 | 贪心
58 0
|
9月前
【每日一题Day297】LC1444切披萨的方案数 | 动态规划+二维前缀和
【每日一题Day297】LC1444切披萨的方案数 | 动态规划+二维前缀和
83 0
|
9月前
|
机器学习/深度学习 人工智能 算法
【代数学作业1完整版-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
【代数学作业1完整版-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
199 0
|
9月前
【每日一题Day133】LC2373矩阵中的局部最大值 | 模拟
【每日一题Day133】LC2373矩阵中的局部最大值 | 模拟
60 0
|
7月前
7-1 sdut-C语言实验-计算组合数
7-1 sdut-C语言实验-计算组合数
61 0
|
9月前
【每日一题Day257】LC2178拆分成最多数目的正偶数之和 | 贪心
【每日一题Day257】LC2178拆分成最多数目的正偶数之和 | 贪心
39 2