funcmaxIncreaseKeepingSkyline(grid [][]int) (ans int) { n := len(grid) rowMax := make([]int, n) colMax := make([]int, n) for i, row := range grid { for j, h := range row { rowMax[i] = max(rowMax[i], h) colMax[j] = max(colMax[j], h) } } for i, row := range grid { for j, h := range row { ans += min(rowMax[i], colMax[j]) - h } } return }
funcmax(a, b int)int { if b > a { return b } return a }
funcmin(a, b int)int { if a > b { return b } return a }
[sol1-Python3]
1 2 3 4 5
classSolution: defmaxIncreaseKeepingSkyline(self, grid: List[List[int]]) -> int: rowMax = list(map(max, grid)) colMax = list(map(max, zip(*grid))) returnsum(min(rowMax[i], colMax[j]) - h for i, row inenumerate(grid) for j, h inenumerate(row))
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
var maxIncreaseKeepingSkyline = function(grid) { const n = grid.length; const rowMax = newArray(n).fill(0); const colMax = newArray(n).fill(0); for (let i = 0; i < n; i++) { for (let j = 0; j < n; j++) { rowMax[i] = Math.max(rowMax[i], grid[i][j]); colMax[j] = Math.max(colMax[j], grid[i][j]); } } let ans = 0; for (let i = 0; i < n; i++) { for (let j = 0; j < n; j++) { ans += Math.min(rowMax[i], colMax[j]) - grid[i][j]; } } return ans; };
复杂度分析
时间复杂度:O(n^2),其中 n 是矩阵 grid 的行数和列数。需要遍历矩阵 grid 两次,第一次遍历计算每一行的最大值和每一列的最大值,第二次遍历计算建筑物高度可以增加的最大总和。
空间复杂度:O(n),其中 n 是矩阵 grid 的行数和列数。需要创建两个长度为 n 的数组分别记录矩阵 grid 的每一行的最大值和每一列的最大值。