[Swift]LeetCode883. 三维形体投影面积 | Projection Area of 3D Shapes

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址: http://www.javashuo.com/article/p-xrcqosws-me.html 
➤若是连接不是山青咏芝的博客园地址,则多是爬取做者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持做者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

On a N * N grid, we place some 1 * 1 * 1 cubes that are axis-aligned with the x, y, and z axes.git

Each value v = grid[i][j] represents a tower of v cubes placed on top of grid cell (i, j).github

Now we view the projection of these cubes onto the xy, yz, and zx planes.数组

A projection is like a shadow, that maps our 3 dimensional figure to a 2 dimensional plane. 微信

Here, we are viewing the "shadow" when looking at the cubes from the top, the front, and the side.app

Return the total area of all three projections.ide

Example 1:spa

Input: [[2]]
Output: 5 

Example 2:code

Input: [[1,2],[3,4]]
Output: 17 Explanation: Here are the three projections ("shadows") of the shape made with each axis-aligned plane.  

Example 3:htm

Input: [[1,0],[0,2]]
Output: 8 

Example 4:

Input: [[1,1,1],[1,0,1],[1,1,1]]
Output: 14 

Example 5:

Input: [[2,2,2],[2,1,2],[2,2,2]]
Output: 21 

Note:

  • 1 <= grid.length = grid[0].length <= 50
  • 0 <= grid[i][j] <= 50

在 N * N 的网格中,咱们放置了一些与 x,y,z 三轴对齐的 1 * 1 * 1 立方体。

每一个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上。

如今,咱们查看这些立方体在 xy、yz 和 zx 平面上的投影

投影就像影子,将三维形体映射到一个二维平面上。

在这里,从顶部、前面和侧面看立方体时,咱们会看到“影子”。

返回全部三个投影的总面积。 

示例 1:

输入:[[2]]
输出:5

示例 2:

输入:[[1,2],[3,4]]
输出:17
解释:
这里有该形体在三个轴对齐平面上的三个投影(“阴影部分”)。

示例 3:

输入:[[1,0],[0,2]]
输出:8

示例 4:

输入:[[1,1,1],[1,0,1],[1,1,1]]
输出:14

示例 5:

输入:[[2,2,2],[2,1,2],[2,2,2]]
输出:21 

提示:

  • 1 <= grid.length = grid[0].length <= 50
  • 0 <= grid[i][j] <= 50

48ms
 1 class Solution {
 2     func projectionArea(_ grid: [[Int]]) -> Int {
 3         var xy = 0, xz = 0, yz = [Int]()
 4         for row in grid {
 5             var z = 0
 6             for cell in 0..<row.count {
 7                 if row[cell] > 0 {
 8                     xy += 1
 9                 }
10                 z = row[cell] > z ? row[cell] : z
11                 if cell < yz.count {
12                     yz[cell] = row[cell] > yz[cell] ? row[cell] : yz[cell]
13                 } else {
14                     yz.append(row[cell])
15                 }
16                 
17             }
18             xz += z
19         }
20         return xy + xz + yz.reduce(0, +)
21     }
22 }

Runtime: 52 ms
Memory Usage: 19.3 MB
 1 class Solution {
 2     func projectionArea(_ grid: [[Int]]) -> Int {
 3         var z:Int = 0
 4         var x:Int = 0
 5         var y:Int = 0
 6         for i in 0..<grid.count
 7         {
 8             var mx:Int = 0
 9             var my:Int = 0
10             for j in 0..<grid.count
11             {
12                 mx = max(mx, grid[j][i])
13                 my = max(my, grid[i][j])
14                 if grid[i][j] > 0
15                 {
16                     z += 1
17                 }
18             }
19             x += mx
20             y += my
21         }
22         return x + y + z
23     }
24 }

52ms

 1 class Solution {
 2     func projectionArea(_ grid: [[Int]]) -> Int {
 3         guard grid.count > 0, grid[0].count > 0 else {
 4             return 0
 5         }
 6         var sumx = 0
 7         var sumy = 0
 8         var x = 0
 9         var y = 0
10         var z = 0
11         for i in 0..<grid.count {
12             x = 0
13             for j in 0..<grid[0].count {
14                 if grid[i][j] > 0 {
15                     z += 1
16                     x = max(x,grid[i][j])
17                 }
18             }
19             sumx += x
20         }
21         for i in 0..<grid[0].count {
22             y = 0
23             for j in 0..<grid.count {
24                 if grid[j][i] > 0 {
25                     y = max(y,grid[j][i])
26                 }
27             }
28             sumy += y
29         }
30         return sumx+sumy+z
31     }
32 }

56ms

1 class Solution {
2     func projectionArea(_ grid: [[Int]]) -> Int {
3         let topShadow = grid.map { r in r.filter { $0 != 0 }.count }.reduce(0, +)
4         let xShadow = grid.reduce(0) { return $0 + ($1.max() ?? 0) }
5         let yShadow = Array(0 ..< grid[0].count).map { c in grid.map {$0[c] }.max() ?? 0 }.reduce(0, +)
6         return topShadow + xShadow + yShadow
7     }
8 }

60ms

 1 class Solution {
 2     func projectionArea(_ grid: [[Int]]) -> Int {        
 3         var topCounter = 0
 4         var leftCounter = 0
 5         var rightCounter = 0
 6         for i in 0..<grid.count {
 7             var maxLine = 0
 8             for j in 0..<grid[0].count {
 9                 if grid[i][j] != 0 {
10                     topCounter += 1
11                 }
12                 maxLine = max(maxLine, grid[i][j])
13             }
14             leftCounter += maxLine
15         }
16         
17         for j in 0..<grid[0].count {
18             var maxCol = 0
19             for i in 0..<grid.count {
20                 maxCol = max(maxCol, grid[i][j])
21             }
22             rightCounter += maxCol
23         }
24         return topCounter + rightCounter + leftCounter
25     }
26 }

64ms

 1 class Solution {
 2     func projectionArea(_ grid: [[Int]]) -> Int {
 3         var total = 0
 4         
 5         for i in 0..<grid.count {
 6             var maxValue = 0
 7             for j in 0..<grid[0].count {
 8                 if grid[i][j] != 0 {
 9                     total += 1
10                 }
11                 maxValue = max(maxValue, grid[i][j])
12             }
13             total += maxValue
14         }
15         
16         for j in 0..<grid[0].count {
17             var maxValue = 0
18             for i in 0..<grid.count {
19                 maxValue = max(maxValue, grid[i][j])
20             }
21             total += maxValue
22         }
23         
24         return total
25     }
26 }

100ms

 1 class Solution {
 2     func projectionArea(_ grid: [[Int]]) -> Int {
 3         //每一个子数组的 count 相加 (要剔除0)
 4         var x = 0
 5         //每一个 index 的最大值相加
 6         var y = 0
 7         //每一个子数组的最大值相加
 8         var z = 0
 9         //用于统计每一个 index 的最大值 key 为 index
10         var dictY: [Int: Int] = [:]
11         grid.forEach { (sun) in
12             if let max = sun.max() {
13                 z += max
14             }
15             sun.enumerated().forEach({ (index, value) in
16                 if value != 0 {
17                     x += 1
18                 }
19                 if let tempY = dictY[index] {
20                     if tempY < value {
21                         //若是存在并小于,更新
22                         dictY.updateValue(value, forKey: index)
23                     }
24                 }else {
25                     //不存在直接更新
26                     dictY.updateValue(value, forKey: index)
27                 }
28             })
29         }
30         dictY.values.forEach{y += $0}
31         return x + y + z
32     }
33 }