返回
掌握 JavaScript,成为天际线守护者!
前端
2024-01-31 19:02:31
## 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 螺旋博客。那里有更多精彩的内容等着你!