每日两题 T5
时间:2022-07-22
本文章向大家介绍每日两题 T5,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法
LeetCode T892. 三维形体的表面积[1]
描述
在 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
分析
该问题主要考察空间想象能力,在网格中放正方体时,根据放置位置,统计表面积。
正方体6个面,但是当两两相叠时,会彼此都少一个面,“丢失”的面随叠加个数的变化关系是:
y = 2 * (n - 1)
,y表示面数,n表示叠起来的正方体个数。就本题而言,在正方体放到网格时我们只需要考虑有多少个正方体重叠即可,网格用二维数组描述,我们这样来计算:
1.共有n个正方体,6 * n 个面2.共有m个正方体两两重叠, 需要在总计表面基础上减去 2 * (m - 1)
n易求,难点在求m,以 [[1,2],[3,4]]
为例依次来求
代码
/**
* @param {number[][]} grid
* @return {number}
*/
var surfaceArea = function(grid) {
if(!grid.length || !grid[0].length) return 0;
let sum = 0;
let n = grid.length;
let m = grid[0].length;
for(let i = 0; i < n; i++)
for(let j = 0; j < m; j++) {
if(grid[i][j] === 0) {
continue;
}
// 下面两行可以优化成:sum += 4*grid[i][j] + 2;
sum += 6*grid[i][j];
sum -= 2*(grid[i][j] - 1);
if(i - 1 >= 0) sum -= 2 * Math.min(grid[i-1][j], grid[i][j]);
if(j - 1 >= 0) sum -= 2 * Math.min(grid[i][j-1], grid[i][j]);
}
return sum;
};
JavaScript
介绍下深度优先遍历和广度优先遍历,如何实现 ?
在进行图的遍历时,会遇到 深度优先
和 广度优先
。通过字面意思,我们能猜出大概,一个是垂直深入,一个是发散广度。
•深度优先
我们可以借助栈保存临时数据,直至在某个分支无下一个元素,则出栈,并进行判断该节点的兄弟节点时候有下个节点,有则遍历,以此类推。
•广度优先
借助队列从第一个节点开始,先遍历完所有下一个节点,再一次遍历节点的下一个节点。
深度优先(DFS)
Graph.prototype.dfs = function() {
var marked = []
for (var i=0; i<this.vertices.length; i++) {
if (!marked[this.vertices[i]]) {
dfsVisit(this.vertices[i])
}
}
function dfsVisit(u) {
let edges = this.edges
marked[u] = true
console.log(u)
var neighbors = edges.get(u)
for (var i=0; i<neighbors.length; i++) {
var w = neighbors[i]
if (!marked[w]) {
dfsVisit(w)
}
}
}
}
广度优先(BFS)
Graph.prototype.bfs = function(v) {
var queue = [], marked = []
marked[v] = true
queue.push(v) // 添加到队尾
while(queue.length > 0) {
var s = queue.shift() // 从队首移除
if (this.edges.has(s)) {
console.log('visited vertex: ', s)
}
let neighbors = this.edges.get(s)
for(let i=0;i<neighbors.length;i++) {
var w = neighbors[i]
if (!marked[w]) {
marked[w] = true
queue.push(w)
}
}
}
}
References
[1]
892. 三维形体的表面积: https://leetcode-cn.com/problems/surface-area-of-3d-shapes/
- 深究|Elasticsearch单字段支持的最大字符数?
- Go语言中Socket通信之Tcp客户端
- Oracle 12c PDB迁移及ORA-00600错误分析和解决(r10笔记第72天)
- 【Go 语言社区】epoll详解
- Oracle 12c数据库升级实战(r10笔记第70天)
- Oracle 12c升级检查问题分析(r10笔记第69天)
- 转--使用Revel(go)开发网站
- GoldenGate数据迁移的问题总结(二)(r10笔记第85天)
- Elasticsearch究竟要设置多少分片数?
- 设计模式(1)-使用简单工厂优化代码
- 简单易学的机器学习算法——因子分解机(Factorization Machine)
- Elasticsearch全文检索实战小结——复盘我带的第二个项目
- golang语言是如何处理栈的
- 【Go 语言社区】并发性
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter框架分析(一)-- 总览和Window
- R海拾遗-sci配色
- Flutter框架分析(二)-- 初始化
- Flutter框架分析(三)-- Widget,Element和RenderObject
- 傅里叶变换的图像应用--学好了用处大~
- Flutter框架分析(四)-- Flutter框架的运行
- R海拾遗-流程图prismadiagramR
- R海拾遗-单项重复测量方差分析
- R海拾遗-双因素重复测量方差分析
- 小白秒变大神--windows窗口+装B神器大全 两部曲
- R海拾遗-三因素重复
- 推荐一种简单的在Flutter中分离View与Model的方法
- R海拾遗-tidyverse
- Flutter Hooks 使用及原理
- ggplot2_总纲