【问题描述】

在 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/

【总结】

  1. 类似题目没有必要刷 题目比较难懂
  2. 数据分析(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]))# 创建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题][图形题]相关推荐

  1. [Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]

    [问题描述][] 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输 ...

  2. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  3. [Leedcode][JAVA][第470题][Ran7()实现Rand10()]

    [问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...

  4. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  5. Java基础编程练习50题(转载)

    JAVA基础编程练习50题 本文对50道经典的java程序题进行详细解说,对于初学者可以跳过一些逻辑性太强的题目,比如第一题用到了方法的递归,初学者可能不理解,最好先看那些有if.for.while可 ...

  6. 牛客网 Java 工程师能力评估 20 题 - 详解

    牛客网 Java 工程师能力评估 20 题 - 详解 不知在看博客的你是否知道 牛客网,不知道就太落后了,分享给你 : 牛客网 此 20 题,绝对不只是 20 题! 免责声明:本博客为学习笔记,如有侵 ...

  7. JAVA习题大全之java期末考试复习预测题一

    JAVA习题大全 目录 JAVA习题大全 java期末考试复习预测题A java期末考试复习预测题B java期末考试复习预测题C java期末考试复习预测题D java期末考试复习预测题E java ...

  8. java二级考试上机_全国java二级考试上机操作题解题指导.doc

    全国java二级考试上机操作题解题指导.doc 还剩 7页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: By [凌风阁] Jane 2013 年秋 J ...

  9. Java常见的面试算法题:实现两个线程交替打印1到100的数

    Java常见的面试算法题:实现两个线程交替打印1到100的数 思路: 这是涉及到多个线程打印的问题,一定会用到锁的(synchronized),故这就是一个多线程打印的典型案例. 代码实现: pack ...

最新文章

  1. 办公word,ppt,excel问题
  2. R构建KNN多分类模型
  3. Mybatis的delete方法
  4. java虚成员函数_Java常见知识点汇总(④)——虚函数、抽象函数、抽象类、接口...
  5. 编写一个简单的assert宏
  6. Programming WCF Services翻译笔记(四)
  7. [剑指offer]面试题45:圆圈中最后剩下的数字
  8. 2018移动端页面适配-自适应最新方案直接写px--------通过gulp工作流搭建一体化的移动端开发环境
  9. ❤️六W字《计算机基础知识》(四)(建议收藏)❤️
  10. java线程同步re_Java线程:线程的同步
  11. JS:关于JS字面量及其容易忽略的12个小问题
  12. 基于JavaWeb的网上鞋店商城的设计实现
  13. 干货|手把手教你写单片机的结构体
  14. 2512 4.7K 5%贴片电阻识别方法
  15. SwitchyOmega_Chromium插件的下载安装以及使用
  16. 如何做好新媒体软文营销推广
  17. reversed python_python字典reversed
  18. selenium3 设置浏览器安装的位置
  19. 《JAVA语言程序设计》期末考试试题及答案
  20. Lesson 3 Please send me a card 请给我寄一张明信片

热门文章

  1. [转载]《STL源码剖析》阅读笔记之 迭代器及traits编程技法
  2. 源码搭建lamp环境
  3. C# 淘宝商品微信返利助手开发-(三)返利助手开发(1)API介绍
  4. android app逆向分析,如何开始对Android应用的逆向分析?
  5. mysql数据库root密码在哪个文件中_mysql - 本地数据库忘记了root用户的密码
  6. PostgreSQL创建数据库报错
  7. vue开发小程序Demo
  8. php 顺序结构,顺序存储结构php实现
  9. 从底层重学 Java 之 Character 字符型 Gitchat连接
  10. winsw将命令部署为服务(比如springboot)