为有牺牲多壮志,敢教日月换新天。

[Swift]LeetCode1253. 重构 2 行二进制矩阵 | Reconstruct a 2-Row Binary Matrix

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(let_us_code)
➤博主域名:https://www.zengqiang.org
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/11831505.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

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

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

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

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

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

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

示例 1:

输入:upper = 2, lower = 1, colsum = [1,1,1]
输出:[[1,1,0],[0,0,1]]
解释:[[1,0,1],[0,1,0]] 和 [[0,1,1],[1,0,0]] 也是正确答案。

示例 2:

输入:upper = 2, lower = 3, colsum = [2,2,1,1]
输出:[]

示例 3:

输入:upper = 5, lower = 5, colsum = [2,1,2,0,1,0,1,2,0,1]
输出:[[1,1,1,0,1,0,0,1,0,0],[1,0,1,0,0,0,1,1,0,1]]

提示:

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

Runtime: 904 ms
Memory Usage: 31.5 MB
 1 class Solution {
 2     func reconstructMatrix(_ upper: Int, _ lower: Int, _ colsum: [Int]) -> [[Int]] {
 3         var upper = upper
 4         let lower = lower
 5         if upper + lower != colsum.reduce(0,+)
 6         {
 7             return [[Int]]()
 8         }
 9         var a:[Int] = [Int]()
10         var b:[Int] = [Int]()
11         for i in colsum
12         {
13             if upper > 0 && i != 0
14             {
15                 upper -= 1
16                 a += [1]
17             }
18             else
19             {
20                 a += [0]   
21             }
22             b += [i - a.last!]
23         }
24         if upper == 0
25         {
26             return [a,b]
27         }
28         return [[Int]]()
29     }
30 }

Runtime: 728 ms
Memory Usage: 29.3 MB
 1 class Solution {
 2     func reconstructMatrix(_ upper: Int, _ lower: Int, _ colsum: [Int]) -> [[Int]] {
 3 
 4         var indices = [Int]()
 5         var onesCount = 0
 6         var  ans = Array<Array<Int>>(repeating: Array<Int>(repeating: 0, count: colsum.count), count: 2)
 7         for i in 0..<colsum.count {
 8             if colsum[i] == 2 {
 9                 ans[1][i] = 1
10                 ans[0][i] = 1
11                 onesCount += 1
12             } else if colsum[i] == 1 {
13                 indices.append(i)
14             }
15         }
16         let upperRemain = upper - onesCount
17         let lowerRemain = lower - onesCount
18         guard upperRemain >= 0 && lowerRemain >= 0 && upperRemain + lowerRemain == indices.count else {
19             return []
20         }
21         let currentUpperSum = upper - onesCount
22         var j = 0
23         while j < currentUpperSum {
24             ans[0][indices[j]] = 1
25             j += 1
26         }
27         while j < indices.count {
28             ans[1][indices[j]] = 1
29             j += 1
30         }
31         return ans
32     }
33 }

 

posted @ 2019-11-10 19:41  为敢技术  阅读(282)  评论(0编辑  收藏  举报