LeetCode 1878. Get Biggest Three Rhombus Sums in a Grid Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
1878. Get Biggest Three Rhombus Sums in a Grid

Description

You are given an m x n integer matrix grid​​​.

A rhombus sum is the sum of the elements that form the border of a regular rhombus shape in grid​​​. The rhombus must have the shape of a square rotated 45 degrees with each of the corners centered in a grid cell. Below is an image of four valid rhombus shapes with the corresponding colored cells that should be included in each rhombus sum:

Note that the rhombus can have an area of 0, which is depicted by the purple rhombus in the bottom right corner.

Return the biggest three distinct rhombus sums in the grid in descending order. If there are less than three distinct values, return all of them.

 

Example 1:

Input: grid = [[3,4,5,1,3],[3,3,4,2,3],[20,30,200,40,10],[1,5,5,4,1],[4,3,2,2,5]]
Output: [228,216,211]
Explanation: The rhombus shapes for the three biggest distinct rhombus sums are depicted above.
- Blue: 20 + 3 + 200 + 5 = 228
- Red: 200 + 2 + 10 + 4 = 216
- Green: 5 + 200 + 4 + 2 = 211

Example 2:

Input: grid = [[1,2,3],[4,5,6],[7,8,9]]
Output: [20,9,8]
Explanation: The rhombus shapes for the three biggest distinct rhombus sums are depicted above.
- Blue: 4 + 2 + 6 + 8 = 20
- Red: 9 (area 0 rhombus in the bottom right corner)
- Green: 8 (area 0 rhombus in the bottom middle)

Example 3:

Input: grid = [[7,7,7]]
Output: [7]
Explanation: All three possible rhombus sums are the same, so return [7].

 

Constraints:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 50
  • 1 <= grid[i][j] <= 105

Solutions

Solution 1: Enumerate Diamond Center + Prefix Sum + Ordered Set

We can preprocess to get two prefix sum arrays s1 and s2, where s1[i][j] represents the sum of the elements on the upper left diagonal ending at (i, j), and s2[i][j] represents the sum of the elements on the upper right diagonal ending at (i, j).

Next, we enumerate each position (i, j), first add grid[i][j] to the ordered set ss, and then enumerate the length k of the diamond. The sum of the diamond with (i, j) as the center and a side length of k is:

\begin{aligned} &\quad s1[i + k][j] - s1[i][j - k] + s1[i][j + k] - s1[i - k][j] \ &+ s2[i][j - k] - s2[i - k][j] + s2[i + k][j] - s2[i][j + k] \ &- grid[i + k - 1][j - 1] + grid[i - k - 1][j - 1] \end{aligned}

We add this value to the ordered set ss, while ensuring that the size of the ordered set ss does not exceed 3. Finally, we output the elements in the ordered set ss in reverse order.

The time complexity is O(m × n × min(m, n)), and the space complexity is O(m × n). Here, m and n are the number of rows and columns of the matrix, respectively.

PythonJavaC++GoTypeScriptRust
class Solution: def getBiggestThree(self, grid: List[List[int]]) -> List[int]: m, n = len(grid), len(grid[0]) s1 = [[0] * (n + 2) for _ in range(m + 1)] s2 = [[0] * (n + 2) for _ in range(m + 1)] for i, row in enumerate(grid, 1): for j, x in enumerate(row, 1): s1[i][j] = s1[i - 1][j - 1] + x s2[i][j] = s2[i - 1][j + 1] + x ss = SortedSet() for i, row in enumerate(grid, 1): for j, x in enumerate(row, 1): l = min(i - 1, m - i, j - 1, n - j) ss.add(x) for k in range(1, l + 1): a = s1[i + k][j] - s1[i][j - k] b = s1[i][j + k] - s1[i - k][j] c = s2[i][j - k] - s2[i - k][j] d = s2[i + k][j] - s2[i][j + k] ss.add( a + b + c + d - grid[i + k - 1][j - 1] + grid[i - k - 1][j - 1] ) while len(ss) > 3: ss.remove(ss[0]) return list(ss)[::-1](code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !