返回

掌握 JavaScript,成为天际线守护者!

前端







## JavaScript 版“守护天际线”:用贪心算法构建城市轮廓

欢迎来到“守护天际线”的 JavaScript 之旅。我们将使用这个迷人的编程问题,探索贪心算法的强大力量,并构建出壮观的城市轮廓。

**引言:贪心算法和 LeetCode 的“守护天际线”** 

贪心算法是一种直观而高效的算法,它在每次决策中都选择当前看来最优的选项,而不管此选择对后续决策的影响。在“守护天际线”问题中,我们的目标是根据建筑物的高度列表来构建天际线。我们将使用贪心算法来选择哪些建筑物应该出现在天际线上,从而最大限度地还原城市的实际轮廓。

**1. 解析 LeetCode 问题表述** 

- 给定一个二维数组 grid,其中 grid[i][j] 表示第 i 行第 j 列建筑物的高度。
- 要求你返回一个新的二维数组 ans,其中 ans[i][j] 表示第 i 行第 j 列建筑物的高度,但需满足以下条件:
  - ans[i][j] 不等于 0 当且仅当 grid[i][j] 不等于 0。
  - ans[i][j] 小于或等于 ans[i][j+1]。
  - ans[i][j] 小于或等于 ans[i-1][j]。

**2. 算法实现:一步步构建天际线** 

1. **初始化** :创建一个与 grid 大小相同的二维数组 ans,并将其初始化为 0。

2. **遍历 grid** :从左到右,从上到下遍历 grid。

3. **检查当前建筑物的高度** :对于每个建筑物,如果其高度大于 0,则将其高度添加到 ans 中。

4. **更新天际线轮廓** :在将当前建筑物的高度添加到 ans 后,检查该建筑物是否改变了天际线轮廓。如果改变了,则更新 ans 中相应位置的高度。

5. **继续遍历** :重复步骤 3 和步骤 4,直到遍历完所有建筑物。

**3. 运行效果:将 JavaScript 代码变为现实** 

现在,让我们将 JavaScript 代码付诸实践。你可以使用 JavaScript 运行时环境或在线 IDE 来运行这段代码。

```javascript
/**
 * @param {number[][]} grid
 * @return {number[][]}
 */
const getSkyline = (grid) => {
  const m = grid.length;
  const n = grid[0].length;
  // 初始化 ans 数组
  const ans = Array.from({ length: m }, () => Array.from({ length: n }, () => 0));
  // 遍历 grid
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      // 检查当前建筑物的高度
      if (grid[i][j] > 0) {
        // 将当前建筑物的高度添加到 ans 中
        ans[i][j] = grid[i][j];
        // 更新天际线轮廓
        for (let k = i - 1; k >= 0; k--) {
          if (ans[k][j] < ans[i][j]) {
            ans[k][j] = ans[i][j];
          }
        }
        for (let k = j - 1; k >= 0; k--) {
          if (ans[i][k] < ans[i][j]) {
            ans[i][k] = ans[i][j];
          }
        }
      }
    }
  }
  // 返回 ans
  return ans;
};

4. 总结与启发:从问题到解决方案

通过解决“守护天际线”问题,我们不仅掌握了贪心算法的原理,还学习了如何将算法应用于实际问题。这仅仅是算法世界的一个小小案例,但它却能为我们打开探索更广阔世界的窗口。

5. 展望未来:持续探索算法的奥秘

算法是一门充满魅力的学科,它为解决各种实际问题提供了有效而优雅的方法。如果你对算法感兴趣,我建议你继续阅读相关书籍和文章,并尝试解决更多的编程问题。相信在算法的道路上,你将不断收获惊喜,不断提升自己的编程能力。

6. 彩蛋:更多精彩内容,尽在 AI 螺旋

感谢你阅读本文。如果你想了解更多关于 JavaScript、算法或其他编程知识,欢迎访问 AI 螺旋博客。那里有更多精彩的内容等着你!