/** * 1765. Map of Highest Peak * https://leetcode.com/problems/map-of-highest-peak/ * Difficulty: Medium * * You are given an integer matrix isWater of size m x n that represents a map of land and * water cells: * - If isWater[i][j] == 0, cell (i, j) is a land cell. * - If isWater[i][j] == 1, cell (i, j) is a water cell. * * You must assign each cell a height in a way that follows these rules: * - The height of each cell must be non-negative. * - If the cell is a water cell, its height must be 0. * - Any two adjacent cells must have an absolute height difference of at most 1. A cell is * adjacent to another cell if the former is directly north, east, south, or west of the * latter (i.e., their sides are touching). * * Find an assignment of heights such that the maximum height in the matrix is maximized. * * Return an integer matrix height of size m x n where height[i][j] is cell (i, j)'s height. * If there are multiple solutions, return any of them. */ /** * @param {number[][]} isWater * @return {number[][]} */ var highestPeak = function(isWater) { const map = isWater.map(row => row.map(() => 0)); const values = isWater.map((row, i) => { return row.map((value, j) => value ? [i, j] : 0); }).flat().filter(Boolean); for (let value = 0; values.length > value;) { const [i, j] = values[value++]; const level = map[i][j] + 1; [[1, 0], [-1, 0], [0, -1], [0, 1]] .map(direction => [i + direction[0], j + direction[1]]) .filter(([x, y]) => 0 === isWater[x]?.[y] && !map[x][y]) .forEach(([x, y]) => (map[x][y] = level, values.push([x, y]))); } return map; };