每日两题 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/