Кожен день має одне випадкове завдання з leetcode. Сьогоднішнє завдання — 1765. Карта найвищої вершини
Опис:
Вам надано ціле матрицю isWater розміру m x n, що представляє карту землі та води.
- Якщо
isWater[i][j] == 0, клітина(i, j)є землею. - Якщо
isWater[i][j] == 1, клітина(i, j)є водою.
Необхідно призначити кожній клітині висоту таким чином, щоб дотримувалися наступні правила:
- Висота кожної клітини повинна бути невід'ємною.
- Якщо клітина є водою, її висота повинна бути
0. - Будь-які дві сусідні клітини повинні мати абсолютну різницю висот не більше
1. Клітина є сусідом іншої, якщо вона розташована безпосередньо на півночі, сході, півдні або заході від іншої (тобто їхні сторони торкаються).
Знайдіть розподіл висот, так щоб максимальна висота в матриці була максимальною.
Поверніть ціле число в матриці height розміру m x n, де height[i][j] це висота клітини (i, j). Якщо є кілька рішень, поверніть будь-яке з них.
Приклад 1:
Вхід: isWater = [[0,1],[0,0]]
Вихід: [[1,0],[2,1]]
Пояснення: Зображення показує призначені висоти для кожної клітини.
Блакитна клітина — це водяна клітина, а зелені клітини — це земельні клітини.
Приклад 2:
Вхід: isWater = [[0,0,1],[1,0,0],[0,0,0]]
Вихід: [[1,1,0],[0,1,1],[1,2,2]]
Пояснення: Висота 2 — це максимальна можлива висота для будь-якого призначення.
Будь-яке призначення висоти, яке має максимальну висоту 2, при дотриманні всіх правил, також буде прийнято.
Ми створюємо масив ans, заповнюємо всі клітини значенням -1. Встановлюємо ці водяні клітини як 0 і зберігаємо їхні [r, c] у queue.
Починаємо з цих водяних клітин. Усі сусідні клітини повинні збільшуватися на 1, якщо вони ще не використані (тобто все ще мають значення -1). Зберігаємо ці збільшені клітини в queue. Перевіряємо всю чергу до кінця.
В кінці повертаємо ans як відповідь.
Якщо довжина isWater дорівнює nm, часова складність — O(nm)
/**
* @param {number[][]} isWater
* @return {number[][]}
*/
var highestPeak = function (isWater) {
const direction = [[1, 0], [-1, 0], [0, 1], [0, -1]]
const n = isWater.length
const m = isWater[0].length
const ans = Array.from({ length: n }, () => Array(m).fill(-1))
const queue = []
for (let r = 0; r < n; r++) {
for (let c = 0; c < m; c++) {
if (isWater[r][c] === 1) {
ans[r][c] = 0
queue.push([r, c])
}
}
}
let index = 0
while (index < queue.length) {
const [r, c] = queue[index]
index++
for (const [x, y] of direction) {
const newX = r + x
const newY = c + y
if (newX >= 0 && newX < n && newY >= 0 && newY < m && ans[newX][newY] === -1) {
ans[newX][newY] = ans[r][c] + 1
queue.push([newX, newY])
}
}
}
return ans
};
Перекладено з: [LeetCode day237–1765](https://medium.com/@okesseko/leetcode-day237-1765-ce204e1ea8cb)