add new solutions

This commit is contained in:
Yiyang Kang 2026-03-19 15:29:54 +09:00
parent f297e11859
commit 4720cbefc4
8 changed files with 290 additions and 0 deletions

View file

@ -0,0 +1,75 @@
// Package q1878 implements a solution for https://leetcode.com/problems/get-biggest-three-rhombus-sums-in-a-grid/
package q1878
import "slices"
func getBiggestThree(grid [][]int) []int {
w, h := len(grid[0]), len(grid)
sums := make([][][2]int, h)
sums[0] = make([][2]int, w*h)
for s := h - 1; s >= 0; s-- {
sums[s] = sums[0][s*w : (s+1)*w]
}
for r := range h {
for c := range w {
pR, pC := r-1, c-1
if pR >= 0 && pC >= 0 {
sums[r][c][0] = sums[pR][pC][0] + grid[r][c]
} else {
sums[r][c][0] = grid[r][c]
}
pR, pC = r-1, c+1
if pR >= 0 && pC < w {
sums[r][c][1] = sums[pR][pC][1] + grid[r][c]
} else {
sums[r][c][1] = grid[r][c]
}
}
}
biggest := []int{0, 0, 0, 0}
var addResult = func(val int) {
for i := 1; i <= 3; i++ {
if biggest[i] == val {
return
}
}
biggest[0] = val
slices.Sort(biggest)
}
var isValid = func(coord [2]int) bool {
return coord[0] >= 0 && coord[1] >= 0 && coord[0] < h && coord[1] < w
}
for r := range h {
for c := range w {
addResult(grid[r][c])
for edge := 2; ; edge++ {
left := [2]int{r + edge - 1, c - edge + 1}
right := [2]int{r + edge - 1, c + edge - 1}
bottom := [2]int{r + (edge-1)*2, c}
if !isValid(left) || !isValid(right) || !isValid(bottom) {
break
}
e1 := sums[left[0]][left[1]][1] - sums[r][c][1]
e2 := sums[bottom[0]][bottom[1]][0] - sums[left[0]][left[1]][0]
e3 := sums[bottom[0]][bottom[1]][1] - sums[right[0]][right[1]][1]
e4 := sums[right[0]][right[1]][0] - sums[r][c][0]
addResult(e1 + e2 + e3 + e4 - grid[bottom[0]][bottom[1]] + grid[r][c])
}
}
}
for biggest = biggest[1:]; biggest[0] == 0; {
biggest = biggest[1:]
}
slices.Reverse(biggest)
return biggest
}
var _ = getBiggestThree