2023-06-29 1253. 重构 2 行二进制矩阵

97 阅读2分钟

leetcode.cn/problems/re…

就按照朴素的想法一个个填矩阵的元素就好了,实际上这是一种贪心的思想。

  • 首先根据 colsum,把和是 2 的列填出来(和是 2,代表该列的两行元素肯定都是 1)。填完之后把colsum 该列的和设置为 0,表达我们已经处理过这一列了。upperlower 的值也要记得更新,自身要减一,因为每一行都填了一个 1 了。
  • 其次再处理 colsum 中值是 1 的元素,有这些情况
    • 首先检查第一行该列能否填 1,即 upper > 0。如果满足条件,该位置填入 1,然后 upper 减一,处理下一个 colsum 中值是 1 的元素
    • 如果不满足 upper > 0 ,检查第二行的该列能否填 1,即 lower > 0。如果满足条件,该位置填入 1,然后 lower 减一,处理下一个 colsum 中值是 1 的元素
    • 最后如果上述两个情况都不存在,说明不存在符合要求的答案,最终结果就是空数组

边界条件

边界条件要特别注意,主要关注以下这些点

  • 处理完所有 colsum 中值是 2 的元素后,检查 upperlower 是否变成负数了,如果任意一个变成负数了,说明不存在符合要求的答案
  • 处理完所有 colsum 中值是 1 的元素后,检查 upperlower 是否全是 0,如果任意一个不是 0,这也说明不存在符合要求的答案
class Solution {
    public List<List<Integer>> reconstructMatrix(int upper, int lower, int[] colsum) {
        int col = colsum.length;
        int[][] ans = new int[2][col];
        for (int i = 0; i < col; ++i) {
            if (colsum[i] == 2) {
                ans[0][i] = ans[1][i] = 1;
                colsum[i] = 0;
                upper--;
                lower--;
            }
        }

        if (upper < 0 || lower < 0) {
            return Collections.emptyList(); 
        }

        boolean noAns = false;
        for (int i = 0; i < col; ++i) {
            if (colsum[i] == 1) {
                if (upper > 0) {
                    ans[0][i] = 1;
                    upper--;
                } else if (lower > 0) {
                    ans[1][i] = 1;
                    lower--;
                } else {
                    noAns = true;
                    break;
                }
            }
        }

        if (noAns || (upper != 0 || lower != 0)) {
            return Collections.emptyList();
        } else {
            List<List<Integer>> ansList = new ArrayList<>();
            for (int[] row : ans) {
                List<Integer> rowList = new ArrayList<>();
                for (int x : row) {
                    rowList.add(x);
                }
                ansList.add(rowList);
            }
            return ansList;
        }
    }
}