1253. 重构 2 行二进制矩阵

1253. 重构 2 行二进制矩阵

题目

题解

使用贪心算法。

首先,一个肯定的点是:

  • 当colsum的元素为2时,相同下标的两个二进制数组元素必须为1
  • 当colsum的元素为0时,相同下标的两个二进制数组元素必须为0

如此一来,我们只需要决策,当colsum元素为1时,哪个数组的元素为1即可。而这一点的判断,则可以取决于对upper的判断,我们只需贪心地先试图填满upper数组,那么lower数组的值自然能够确定下来。

class Solution {
    public List<List<Integer>> reconstructMatrix(int upper, int lower, int[] colsum) {
        // 获取每行数组的长度,并初始化每行数组
        int sizeOfArray = colsum.length;
        int[] a1 = new int[sizeOfArray];
        int[] a2 = new int[sizeOfArray];

        // 定义当前状态下的upper和lower
        int currUpper = 0;
        int currLower = 0;
        // 标记是否有解,默认有解
        boolean flag = true;

        for(int i=0;i<sizeOfArray;i++){
           int el = colsum[i];
           // 填充el=2时两个数组的元素
           if (el == 2) {
                a1[i] = 1;
                a2[i] = 1;
                currUpper++;
                currLower++;
            }
            // 填充el=0时两个数组的元素
            // 因为定义的是基本数据类型的数组,这一步可以省略
        }

        for(int i=0;i<sizeOfArray;i++){
            int el = colsum[i];
            if (el == 1) {
                // 此时, el = 1, 我们需要决策,这个1分配给哪个数组
                // 优先填充upper数组
                if (currUpper < upper) {
                    a1[i] = 1;
                    currUpper++;
                } else {
                    a2[i] = 1;
                    currLower++;
                }
            }
            // 当 currUpper <= upper 且 currLower <= lower 时,才可能是有解的
            flag = currUpper <= upper && currLower <= lower;
            if (!flag) {
                break;
            }
        }

        List<List<Integer>> result = new ArrayList();
        // System.out.println(Arrays.stream(a1).boxed().collect(Collectors.toList()));
        // System.out.println(Arrays.stream(a2).boxed().collect(Collectors.toList()));
        flag = flag && currUpper == upper && currLower == lower; // 判断是否有解
        if (flag) {
            result.add(Arrays.stream(a1).boxed().collect(Collectors.toList()));
            result.add(Arrays.stream(a2).boxed().collect(Collectors.toList()));
        }
        return result;
    }
}

 

posted @ 2023-06-29 22:17  w一蓑烟雨任平生w  阅读(20)  评论(0)    收藏  举报