|
| 1 | +function riverSizes(matrix) { |
| 2 | + const riversSizes = []; |
| 3 | + const m = matrix.length |
| 4 | + const n = matrix[0].length |
| 5 | + const notVisited = new Array(m*n).fill(1) |
| 6 | + const context = { |
| 7 | + m, |
| 8 | + n, |
| 9 | + visit: (i, j) => notVisited[i*n + j] = 0, |
| 10 | + isNotVisited: (i, j) => notVisited[i*n + j], |
| 11 | + isValidRiver: ([i, j]) => context.isNotVisited(i, j) && matrix[i][j], |
| 12 | + } |
| 13 | + |
| 14 | + for (let i = 0; i < matrix.length; i++) |
| 15 | + for (let j = 0; j < matrix[i].length; j++) |
| 16 | + if (context.isValidRiver([i, j])) |
| 17 | + riversSizes.push(traverse(context, [i, j], 1)) |
| 18 | + |
| 19 | + return riversSizes |
| 20 | +} |
| 21 | + |
| 22 | +function traverse(context, [i, j], length) { |
| 23 | + context.visit(i, j) |
| 24 | + const { m, n, isValidRiver } = context |
| 25 | + |
| 26 | + if (j - 1 >= 0 && isValidRiver([i, j - 1])) length = traverse(context, [i, j - 1], length + 1) |
| 27 | + if (j + 1 < n && isValidRiver([i, j + 1])) length = traverse(context, [i, j + 1], length + 1) |
| 28 | + if (i - 1 >= 0 && isValidRiver([i - 1, j])) length = traverse(context, [i - 1, j], length + 1) |
| 29 | + if (i + 1 < m && isValidRiver([i + 1, j])) length = traverse(context, [i + 1, j], length + 1) |
| 30 | + |
| 31 | + return length |
| 32 | +} |
| 33 | + |
| 34 | +// Do not edit the line below. |
| 35 | +exports.riverSizes = riverSizes; |
| 36 | + |
| 37 | +const test = true |
| 38 | +if (typeof test === 'boolean' && test) { |
| 39 | + const { expect } = require('../leet-code/utils.js'); |
| 40 | + console.clear() |
| 41 | + expect(riverSizes([ |
| 42 | + [0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1], |
| 43 | + [1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1], |
| 44 | + ]) /*?*/, [4, 18]) //?.s $ |
| 45 | + expect(riverSizes([ |
| 46 | + [0, 1, 0, 1, 1], |
| 47 | + [1, 1, 1, 0, 0], |
| 48 | + [1, 1, 0, 0, 1], |
| 49 | + [1, 0, 1, 1, 1], |
| 50 | + [1, 1, 1, 0, 0], |
| 51 | + ]) /*?*/, [14,2]) //?.s $ |
| 52 | + expect(riverSizes([ |
| 53 | + [1, 0, 0, 0, 0, 0, 1], |
| 54 | + [0, 1, 0, 0, 0, 1, 0], |
| 55 | + [0, 0, 1, 0, 1, 0, 0], |
| 56 | + [0, 0, 1, 1, 1, 0, 0], |
| 57 | + [0, 0, 1, 0, 1, 0, 0], |
| 58 | + [0, 1, 0, 0, 0, 1, 0], |
| 59 | + [1, 0, 0, 0, 0, 0, 1] |
| 60 | + ]) /*?*/, [1, 1, 1, 1, 7, 1, 1, 1, 1]) //?.s $ |
| 61 | +} |
0 commit comments