zoukankan      html  css  js  c++  java
  • 【leetcode】1253. Reconstruct a 2-Row Binary Matrix

    题目如下:

    Given the following details of a matrix with n columns and 2 rows :

    • The matrix is a binary matrix, which means each element in the matrix can be 0 or 1.
    • The sum of elements of the 0-th(upper) row is given as upper.
    • The sum of elements of the 1-st(lower) row is given as lower.
    • The sum of elements in the i-th column(0-indexed) is colsum[i], where colsum is given as an integer array with length n.

    Your task is to reconstruct the matrix with upperlower and colsum.

    Return it as a 2-D integer array.

    If there are more than one valid solution, any of them will be accepted.

    If no valid solution exists, return an empty 2-D array.

    Example 1:

    Input: upper = 2, lower = 1, colsum = [1,1,1]
    Output: [[1,1,0],[0,0,1]]
    Explanation: [[1,0,1],[0,1,0]], and [[0,1,1],[1,0,0]] are also correct answers.
    

    Example 2:

    Input: upper = 2, lower = 3, colsum = [2,2,1,1]
    Output: []
    

    Example 3:

    Input: upper = 5, lower = 5, colsum = [2,1,2,0,1,0,1,2,0,1]
    Output: [[1,1,1,0,1,0,0,1,0,0],[1,0,1,0,0,0,1,1,0,1]]

    Constraints:

    • 1 <= colsum.length <= 10^5
    • 0 <= upper, lower <= colsum.length
    • 0 <= colsum[i] <= 2

    解题思路:colsum[i] = 0 和 colsum[i] = 2的场景很简单,output[0][i] 和 output[1][i]  都为0或者都为1即可。剩下colsum[i] = 1的场景,优先把1分配给output[0][i] ,达到upper上限后,再把剩余的1分配给output[1][i]。

    代码如下:

    class Solution(object):
        def reconstructMatrix(self, upper, lower, colsum):
            """
            :type upper: int
            :type lower: int
            :type colsum: List[int]
            :rtype: List[List[int]]
            """
            res = [[0] * len(colsum) for _ in range(2)]
            one_count = 0
            two_count = 0
            for i in range(len(colsum)):
                if colsum[i] == 2:
                    res[0][i] = res[1][i] = 1
                    two_count += 1
                elif colsum[i] == 1:one_count += 1
            if upper < two_count or lower < two_count or (upper - two_count + lower - two_count) != one_count:
                return []
    
            count = upper - two_count
            for i in range(len(colsum)):
                if colsum[i] == 0 or colsum[i] == 2:continue
                if count > 0:
                    res[0][i] = 1
                    count -= 1
                else:
                    res[1][i] = 1
    
            return res
  • 相关阅读:
    BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd
    Luogu 3690 Link Cut Tree
    CF1009F Dominant Indices
    CF600E Lomsat gelral
    bzoj 4303 数列
    CF1114F Please, another Queries on Array?
    CF1114B Yet Another Array Partitioning Task
    bzoj 1858 序列操作
    bzoj 4852 炸弹攻击
    bzoj 3564 信号增幅仪
  • 原文地址:https://www.cnblogs.com/seyjs/p/11841232.html
Copyright © 2011-2022 走看看