leetcode

Leetcode Solutions (0x6A73)
git clone https://git.pngu.org/leetcode
Log | Files | Refs | Submodules | README

commit c41c6f3448287f1a9db53c866f67ce7bce59b5a3
parent 9728c041cb2afd801c7a9c3c760fd374dcb8b35a
Author: Jack Sangdahl <jack@pngu.org>
Date:   Sun, 15 Mar 2026 21:01:45 -0600

1878. get biggest three rhombus sums in a grid

Diffstat:
Abiggest_three_rhombus_sum.c | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abiggest_three_rhombus_sum.py | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 157 insertions(+), 0 deletions(-)

diff --git a/biggest_three_rhombus_sum.c b/biggest_three_rhombus_sum.c @@ -0,0 +1,98 @@ +// 1878. Get Biggest Three Rhombus Sums in a Grid +#include "leetcode.h" + +/* + * you are given an 'm x n' integer matrix 'grid'. a rhombus sum is the sum of + * the elements that form the border of 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. + */ + +void add_val(int *top, int val) { + if (val == top[0] || val == top[1] || val == top[2]) + return; + if (val > top[0]) { + top[2] = top[1]; + top[1] = top[0]; + top[0] = val; + } else if (val > top[1]) { + top[2] = top[1]; + top[1] = val; + } else if (val > top[2]) + top[2] = val; +} + +int *getBiggestThree(int **grid, int gridSize, int *gridColSize, + int *returnSize) { + int m = gridSize, n = gridColSize[0]; + int top[3] = {-1, -1, -1}; + for (int r = 0; r < m; ++r) + for (int c = 0; c < n; ++c) { + add_val(top, grid[r][c]); + int l = 1; + while (r + 2 * l < m && c - l >= 0 && c + l < n) { + int s = 0; + for (int i = 0; i < l; i++) + s += grid[r + i][c + i]; + for (int i = 0; i < l; i++) + s += grid[r + l + i][c + l + i]; + for (int i = 0; i < l; i++) + s += grid[r + 2 * l - i][c - i]; + for (int i = 0; i < l; i++) + s += grid[r + l - i][c - l + i]; + add_val(top, s); + l++; + } + } + int cnt = 0; + for (int i = 0; i < 3; i++) + if (top[i] != -1) + cnt++; + *returnSize = cnt; + int *ans = (int *)malloc(cnt * sizeof(int)); + memcpy(ans, top, cnt * sizeof(int)); + return ans; +} + +int main() { + int g1i[6][6] = {{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}}; + int g2i[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; + int g3i[1][3] = {{7, 7, 7}}; + int r1[] = {228, 219, 216}, rs1; + int r2[] = {20, 9, 8}, rs2; + int r3[] = {7}, rs3; + struct two_d_arr *g1 = + two_d_arr_init(ARRAY_SIZE(g1i), ARRAY_SIZE(g1i[0]), g1i); + struct two_d_arr *g2 = + two_d_arr_init(ARRAY_SIZE(g2i), ARRAY_SIZE(g2i[0]), g2i); + struct two_d_arr *g3 = + two_d_arr_init(ARRAY_SIZE(g3i), ARRAY_SIZE(g3i[0]), g3i); + int *gbt1 = getBiggestThree(g1->arr, g1->row_size, g1->col_size, &rs1); + int *gbt2 = getBiggestThree(g2->arr, g2->row_size, g2->col_size, &rs2); + int *gbt3 = getBiggestThree(g3->arr, g3->row_size, g3->col_size, &rs3); + for (int i = 0; i < rs1; i++) { + printf("%d ", gbt1[i]); + assert(gbt1[i] == r1[i]); + } + printf("\n"); + for (int i = 0; i < rs2; i++) { + printf("%d ", gbt2[i]); + assert(gbt2[i] == r2[i]); + } + printf("\n"); + for (int i = 0; i < rs3; i++) { + printf("%d ", gbt3[i]); + assert(gbt3[i] == r3[i]); + } + printf("\n"); + free(gbt1); + free(gbt2); + free(gbt3); + two_d_arr_free(g1); + two_d_arr_free(g2); + two_d_arr_free(g3); +} diff --git a/biggest_three_rhombus_sum.py b/biggest_three_rhombus_sum.py @@ -0,0 +1,59 @@ +# 1878. Get Biggest Three Rhombus Sums in a Grid +import heapq +from typing import List + +""" +you are given an 'm x n' integer matrix 'grid'. a rhombus sum is the sum of +the elements that form the border of 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. +""" + + +class Solution: + def getBiggestThree(self, grid: List[List[int]]) -> List[int]: + m, n = len(grid), len(grid[0]) + max_length = min((m - 1) // 2, (n - 1) // 2) + best = [] + heapq.heapify(best) + + def rhombus_sum(r, c, k): + result = grid[r][c] + for s in range(k): + r += 1 + result += grid[r][c + s + 1] + result += grid[r][c - s - 1] + for s in range(k - 1, -1, -1): + r += 1 + result += grid[r][c + s] + if s > 0: + result += grid[r][c - s] + return result + + for r in range(m): + for c in range(n): + for k in range(max_length + 1): + if c >= k and c + k < n and r + 2 * k < m: + candidate = rhombus_sum(r, c, k) + if candidate not in set(best): + heapq.heappush(best, candidate) + if len(best) > 3: + heapq.heappop(best) + return sorted(best, reverse=True) + + +if __name__ == "__main__": + obj = Solution() + print( + obj.getBiggestThree( + 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], + ] + ) + ) + print(obj.getBiggestThree(grid=[[1, 2, 3], [4, 5, 6], [7, 8, 9]])) + print(obj.getBiggestThree(grid=[[7, 7, 7]]))