生活随笔
收集整理的這篇文章主要介紹了
[Leedcode][JAVA][第892题][图形题]
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
【問題描述】
在?N?*?N?的網格上,我們放置一些?1 * 1 * 1??的立方體。每個值?v = grid[i][j]?表示?v?個正方體疊放在對應單元格?(i, j)?上。請你返回最終形體的表面積。示例 1:輸入:[[2]]
輸出:10
示例 2:輸入:[[1,2],[3,4]]
輸出:34
示例 3:輸入:[[1,0],[0,2]]
輸出:16
示例 4:輸入:[[1,1,1],[1,0,1],[1,1,1]]
輸出:32
示例?5:輸入:[[2,2,2],[2,1,2],[2,2,2]]
輸出:46提示:1 <= N <= 50
0 <= grid[i][j] <= 50
【解答思路】
1. 時間復雜度:O(N^2)
一個球六個面
當垂直時,重疊(垂直個數減1)
當水平時(行列),重疊(取矮的個數)
grid[i][j]表示在坐標(i, j)上有grid[i][j]個正方體。
例子:[[1, 2], [3, 4]],
grid[0][0] = 1,表示坐標(0, 0)上有1個正方體。
grid[0][1] = 2,表示坐標(0, 1)上有2個正方體。
grid[1][0] = 3,表示坐標(1, 0)上有3個正方體。
grid[1][1] = 4,表示坐標(1, 1)上有4個正方體。
(中間兩者與順序無關)
public int surfaceArea(int[][] grid) {// 習慣上應該做參數檢查,但題目中給出了 N >= 1 ,故可以略去int rows = grid.length;// 題目保證了輸入一定是 N * N,但為了使得程序適用性更強,還是單獨把 cols 做賦值int cols = grid[0].length;int sum = 0;// 垂直重疊int verticalOverlap = 0;// 行重疊int rowOverlap = 0;// 列重疊int colOverlap = 0;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {sum += grid[i][j];if (grid[i][j] > 1) {verticalOverlap += (grid[i][j] - 1);}if (j > 0) {rowOverlap += Math.min(grid[i][j - 1], grid[i][j]);}if (i > 0) {colOverlap += Math.min(grid[i - 1][j], grid[i][j]);}}}return sum * 6 - (verticalOverlap + rowOverlap + colOverlap) * 2;}//代碼鏈接:https://leetcode-cn.com/problems/surface-area-of-3d-shapes/solution/hua-tu-ji-suan-san-ge-zhong-die-bu-fen-by-liweiwei/
【總結】
類似題目沒有必要刷 題目比較難懂數據分析(pandas)和數據可視化(matplotlib)的工作使用 python
- 多查google,多看官方文檔
= 官方文檔一般都會給出api的使用方法
from functools import reduce
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3Ddef draw(grid):n = len(grid)z_max = np.max(grid)# 設置長寬高x, y, z = np.indices((n, n, z_max))cubes = []for i in range(n):for j in range(n):# 這是每個柱體cubes.append((x == i) & (y == j) & (z < grid[i][j]))# 創(chuàng)建voxels,包含所有柱體voxels = reduce(lambda x, y: x | y, cubes)# 設置顏色colors = np.empty(voxels.shape, dtype=object)for cube in cubes:colors[cube] = 'red'# 畫圖!fig = plt.figure()ax = fig.gca(projection='3d')ax.voxels(voxels, facecolors=colors, edgecolor='k')plt.show()# 畫一下示例2的3D圖
draw([[1, 2], [3, 4]])
//代碼來源https://mp.weixin.qq.com/s/IZCw6GtdFLUcixp3EiP5yg
總結
以上是生活随笔為你收集整理的[Leedcode][JAVA][第892题][图形题]的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。