算法

1253. 重构 2 行二进制矩阵

2023-06-28  本文已影响0人  红树_

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

题目

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

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

解题思路

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;
    }
}

复杂度分析

上一篇 下一篇

猜你喜欢

热点阅读