Skip to content

Commit e8cb37e

Browse files
authored
update: 添加问题“1878.矩阵中最大的三个菱形和”的代码和题解 (#1447)
* word: 2026.3.16 en * 1878: WA.cpp (#1445) - 果然WA了 * 1878: WA.cpp (#1445) - 刚刚 1. 三个互不相同的和,不只是三个互不相同的菱形 2. i j范围写错了 * 1878: AC.cpp (#1445) - AC,35.29%,33.33% * word: 2026.3.17 en * clean: mv chat.sh $NEXTCLOUD_PATH/Codes/gh-pr-review * update: 添加问题“1878.矩阵中最大的三个菱形和”的代码和题解 (#1447) Signed-off-by: LetMeFly666 <Tisfy@qq.com> --------- Signed-off-by: LetMeFly666 <Tisfy@qq.com>
1 parent 13c1172 commit e8cb37e

5 files changed

Lines changed: 260 additions & 4 deletions
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
* @Author: LetMeFly
3+
* @Date: 2026-03-16 22:56:57
4+
* @LastEditors: LetMeFly.xyz
5+
* @LastEditTime: 2026-03-17 00:04:02
6+
*/
7+
#ifdef _DEBUG
8+
#include "_[1,2]toVector.h"
9+
#endif
10+
11+
/*
12+
↘ (i, j) -> (x, y): diag[x+1][y+1] - diag[i][j]
13+
↗ (i, j) -> (x, y): anti[i+1][j] - anti[x][y+1]
14+
*/
15+
class Solution {
16+
private:
17+
int x = 0, y = 0, z = 0; // 三大
18+
vector<vector<int>> diag, anti;
19+
20+
void update(int v) {
21+
if (v > x) {
22+
z = y, y = x, x = v;
23+
} else if (v < x && v > y) {
24+
z = y, y = v;
25+
} else if (v < y && v > z) {
26+
z = v;
27+
}
28+
}
29+
30+
void calc(int i, int j, int k) {
31+
if (!k) {
32+
return update(diag[i + 1][j + 1] - diag[i][j]);
33+
}
34+
// 上:i - k, j
35+
// 下:i + k, j
36+
// 左:i, j - k
37+
// 右:i, j + k
38+
int val = 0
39+
+ diag[i][j + k] - diag[i - k][j] // ↘ [上, 右):(i-k, j)->(i, j+k) | (i-k,j)->(i-1, j+k-1)
40+
+ diag[i + k + 1][j + 1] - diag[i + 1][j - k + 1] // ↘ (左, 下]:(i,j-k)->(i+k,j) | (i+1,j-k+1)->(i+k,j)
41+
+ anti[i + 1][j - k] - anti[i - k + 1][j] // ↗ [左, 上):(i,j-k)->(i-k,j) | (i,j-k)->(i-k+1,j-1)
42+
+ anti[i + k][j + 1] - anti[i][j + k + 1]; // ↗ (下, 右]:(i+k,j)->(i,j+k) | (i+k-1,j+1)->(i,j+k)
43+
update(val);
44+
}
45+
public:
46+
vector<int> getBiggestThree(vector<vector<int>>& grid) {
47+
int n = grid.size(), m = grid[0].size();
48+
diag = vector<vector<int>>(n + 1, vector<int>(m + 1)); //
49+
anti = vector<vector<int>>(n + 1, vector<int>(m + 1)); //
50+
for (int i = 0; i < n; i++) {
51+
for (int j = 0; j < m; j++) {
52+
diag[i + 1][j + 1] = diag[i][j] + grid[i][j];
53+
anti[i + 1][j] = anti[i][j + 1] + grid[i][j];
54+
}
55+
}
56+
57+
for (int i = 0; i < n; i++) {
58+
for (int j = 0; j < m; j++) {
59+
for (int k = 0, max_k = min(i, min(j, min(n - i - 1, m - j - 1))); k <= max_k; k++) {
60+
calc(i, j, k);
61+
}
62+
}
63+
}
64+
65+
vector<int> ans;
66+
if (x) {
67+
ans.push_back(x);
68+
}
69+
if (y) {
70+
ans.push_back(y);
71+
}
72+
if (z) {
73+
ans.push_back(z);
74+
}
75+
return ans;
76+
}
77+
};

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,7 @@
698698
|1863.找出所有子集的异或总和再求和|简单|<a href="https://leetcode.cn/problems/sum-of-all-subset-xor-totals/" target="_blank">题目地址</a>|<a href="https://blog.letmefly.xyz/2025/04/06/LeetCode%201863.%E6%89%BE%E5%87%BA%E6%89%80%E6%9C%89%E5%AD%90%E9%9B%86%E7%9A%84%E5%BC%82%E6%88%96%E6%80%BB%E5%92%8C%E5%86%8D%E6%B1%82%E5%92%8C/" target="_blank">题解地址</a>|<a href="https://letmefly.blog.csdn.net/article/details/147027120" target="_blank">CSDN题解</a>|<a href="https://leetcode.cn/problems/sum-of-all-subset-xor-totals/solutions/3642017/letmefly-1863zhao-chu-suo-you-zi-ji-de-y-a02c/" target="_blank">LeetCode题解</a>|
699699
|1870.准时到达的列车最小时速|中等|<a href="https://leetcode.cn/problems/minimum-speed-to-arrive-on-time/" target="_blank">题目地址</a>|<a href="https://blog.letmefly.xyz/2024/10/02/LeetCode%201870.%E5%87%86%E6%97%B6%E5%88%B0%E8%BE%BE%E7%9A%84%E5%88%97%E8%BD%A6%E6%9C%80%E5%B0%8F%E6%97%B6%E9%80%9F/" target="_blank">题解地址</a>|<a href="https://letmefly.blog.csdn.net/article/details/142680612" target="_blank">CSDN题解</a>|<a href="https://leetcode.cn/problems/minimum-speed-to-arrive-on-time/solutions/2937033/letmefly-1870zhun-shi-dao-da-de-lie-che-liv8g/" target="_blank">LeetCode题解</a>|
700700
|1877.数组中最大数对和的最小值|中等|<a href="https://leetcode.cn/problems/minimize-maximum-pair-sum-in-array/" target="_blank">题目地址</a>|<a href="https://blog.letmefly.xyz/2026/01/24/LeetCode%201877.%E6%95%B0%E7%BB%84%E4%B8%AD%E6%9C%80%E5%A4%A7%E6%95%B0%E5%AF%B9%E5%92%8C%E7%9A%84%E6%9C%80%E5%B0%8F%E5%80%BC/" target="_blank">题解地址</a>|<a href="https://letmefly.blog.csdn.net/article/details/157333871" target="_blank">CSDN题解</a>|<a href="https://leetcode.cn/problems/minimize-maximum-pair-sum-in-array/solutions/3888405/letmefly-1877shu-zu-zhong-zui-da-shu-dui-sm70/" target="_blank">LeetCode题解</a>|
701+
|1878.矩阵中最大的三个菱形和|中等|<a href="https://leetcode.cn/problems/get-biggest-three-rhombus-sums-in-a-grid/" target="_blank">题目地址</a>|<a href="https://blog.letmefly.xyz/2026/03/17/LeetCode%201878.%E7%9F%A9%E9%98%B5%E4%B8%AD%E6%9C%80%E5%A4%A7%E7%9A%84%E4%B8%89%E4%B8%AA%E8%8F%B1%E5%BD%A2%E5%92%8C/" target="_blank">题解地址</a>|<a href="https://letmefly.blog.csdn.net/article/details/159162029" target="_blank">CSDN题解</a>|<a href="https://leetcode.cn/problems/get-biggest-three-rhombus-sums-in-a-grid/solutions/3928252/letmefly-1878ju-zhen-zhong-zui-da-de-san-yi1y/" target="_blank">LeetCode题解</a>|
701702
|1884.鸡蛋掉落-两枚鸡蛋|中等|<a href="https://leetcode.cn/problems/egg-drop-with-2-eggs-and-n-floors/" target="_blank">题目地址</a>|<a href="https://blog.letmefly.xyz/2024/10/13/LeetCode%201884.%E9%B8%A1%E8%9B%8B%E6%8E%89%E8%90%BD-%E4%B8%A4%E6%9E%9A%E9%B8%A1%E8%9B%8B/" target="_blank">题解地址</a>|<a href="https://letmefly.blog.csdn.net/article/details/142906976" target="_blank">CSDN题解</a>|<a href="https://leetcode.cn/problems/egg-drop-with-2-eggs-and-n-floors/solutions/2949710/letmefly-1884ji-dan-diao-luo-liang-mei-j-saz6/" target="_blank">LeetCode题解</a>|
702703
|1888.使二进制字符串字符交替的最少反转次数|中等|<a href="https://leetcode.cn/problems/minimum-number-of-flips-to-make-the-binary-string-alternating/" target="_blank">题目地址</a>|<a href="https://blog.letmefly.xyz/2026/03/07/LeetCode%201888.%E4%BD%BF%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%AD%97%E7%AC%A6%E4%BA%A4%E6%9B%BF%E7%9A%84%E6%9C%80%E5%B0%91%E5%8F%8D%E8%BD%AC%E6%AC%A1%E6%95%B0/" target="_blank">题解地址</a>|<a href="https://letmefly.blog.csdn.net/article/details/158813763" target="_blank">CSDN题解</a>|<a href="https://leetcode.cn/problems/minimum-number-of-flips-to-make-the-binary-string-alternating/solutions/3918582/letmefly-1888shi-er-jin-zhi-zi-fu-chuan-8b104/" target="_blank">LeetCode题解</a>|
703704
|1895.最大的幻方|中等|<a href="https://leetcode.cn/problems/largest-magic-square/" target="_blank">题目地址</a>|<a href="https://blog.letmefly.xyz/2026/01/18/LeetCode%201895.%E6%9C%80%E5%A4%A7%E7%9A%84%E5%B9%BB%E6%96%B9/" target="_blank">题解地址</a>|<a href="https://letmefly.blog.csdn.net/article/details/157104818" target="_blank">CSDN题解</a>|<a href="https://leetcode.cn/problems/largest-magic-square/solutions/3883805/letmefly-1895zui-da-de-huan-fang-bao-li-9ln7k/" target="_blank">LeetCode题解</a>|
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
---
2+
title: 1878.矩阵中最大的三个菱形和:斜向前缀和
3+
date: 2026-03-17 13:31:48
4+
tags: [题解, LeetCode, 中等, 数组, 数学, 矩阵, 前缀和, 排序, 堆(优先队列)]
5+
categories: [题解, LeetCode]
6+
index_img: https://assets.leetcode.com/uploads/2021/04/23/pc73-q4-desc-2.png
7+
---
8+
9+
# 【LetMeFly】1878.矩阵中最大的三个菱形和:斜向前缀和
10+
11+
力扣题目链接:[https://leetcode.cn/problems/get-biggest-three-rhombus-sums-in-a-grid/](https://leetcode.cn/problems/get-biggest-three-rhombus-sums-in-a-grid/)
12+
13+
<p>给你一个 <code>m x n</code> 的整数矩阵 <code>grid</code> 。</p>
14+
15+
<p><strong>菱形和</strong> 指的是 <code>grid</code> 中一个正菱形 <strong>边界</strong> 上的元素之和。本题中的菱形必须为正方形旋转45度,且四个角都在一个格子当中。下图是四个可行的菱形,每个菱形和应该包含的格子都用了相应颜色标注在图中。</p>
16+
<img alt="" src="https://assets.leetcode.com/uploads/2021/04/23/pc73-q4-desc-2.png" style="width: 385px; height: 385px;" />
17+
<p> </p>
18+
19+
<p>注意,菱形可以是一个面积为 0 的区域,如上图中右下角的紫色菱形所示。</p>
20+
21+
<p>请你按照 <strong>降序</strong> 返回 <code>grid</code> 中三个最大的 <strong>互不相同的菱形和</strong> 。如果不同的和少于三个,则将它们全部返回。</p>
22+
23+
<p> </p>
24+
25+
<p><strong>示例 1:</strong></p>
26+
<img alt="" src="https://assets.leetcode.com/uploads/2021/04/23/pc73-q4-ex1.png" style="width: 360px; height: 361px;" />
27+
<pre>
28+
<b>输入:</b>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]]
29+
<b>输出:</b>[228,216,211]
30+
<b>解释:</b>最大的三个菱形和如上图所示。
31+
- 蓝色:20 + 3 + 200 + 5 = 228
32+
- 红色:200 + 2 + 10 + 4 = 216
33+
- 绿色:5 + 200 + 4 + 2 = 211
34+
</pre>
35+
36+
<p><strong>示例 2:</strong></p>
37+
<img alt="" src="https://assets.leetcode.com/uploads/2021/04/23/pc73-q4-ex2.png" style="width: 217px; height: 217px;" />
38+
<pre>
39+
<b>输入:</b>grid = [[1,2,3],[4,5,6],[7,8,9]]
40+
<b>输出:</b>[20,9,8]
41+
<b>解释:</b>最大的三个菱形和如上图所示。
42+
- 蓝色:4 + 2 + 6 + 8 = 20
43+
- 红色:9 (右下角红色的面积为 0 的菱形)
44+
- 绿色:8 (下方中央面积为 0 的菱形)
45+
</pre>
46+
47+
<p><strong>示例 3:</strong></p>
48+
49+
<pre>
50+
<b>输入:</b>grid = [[7,7,7]]
51+
<b>输出:</b>[7]
52+
<b>解释:</b>所有三个可能的菱形和都相同,所以返回 [7] 。
53+
</pre>
54+
55+
<p> </p>
56+
57+
<p><strong>提示:</strong></p>
58+
59+
<ul>
60+
<li><code>m == grid.length</code></li>
61+
<li><code>n == grid[i].length</code></li>
62+
<li><code>1 <= m, n <= 100</code></li>
63+
<li><code>1 <= grid[i][j] <= 10<sup>5</sup></code></li>
64+
</ul>
65+
66+
67+
68+
## 解题方法:斜向前缀和
69+
70+
严格按照以下约定计算和使用前缀和:
71+
72+
+`(i, j) -> (x, y)`: $diag[x+1][y+1] - diag[i][j]$
73+
+`(i, j) -> (x, y)`: $anti[i+1][j] - anti[x][y+1]$
74+
75+
遍历一遍原始数组我们即可得到前缀和数组。
76+
77+
然后枚举每个菱形的中心和菱形的二分之一对角线长度$k$,依据前缀和计算4条边的长度,三个变量维护三个最大的不同周长。
78+
79+
+ 时间复杂度$O(nm\min(m,n))$
80+
+ 空间复杂度$O(mn)$
81+
82+
主要是很多边界值加一减一的要细心。
83+
84+
### AC代码
85+
86+
#### C++
87+
88+
```cpp
89+
/*
90+
* @LastEditTime: 2026-03-17 00:04:02
91+
*/
92+
/*
93+
↘ (i, j) -> (x, y): diag[x+1][y+1] - diag[i][j]
94+
↗ (i, j) -> (x, y): anti[i+1][j] - anti[x][y+1]
95+
*/
96+
class Solution {
97+
private:
98+
int x = 0, y = 0, z = 0; // 三大
99+
vector<vector<int>> diag, anti;
100+
101+
void update(int v) {
102+
if (v > x) {
103+
z = y, y = x, x = v;
104+
} else if (v < x && v > y) {
105+
z = y, y = v;
106+
} else if (v < y && v > z) {
107+
z = v;
108+
}
109+
}
110+
111+
void calc(int i, int j, int k) {
112+
if (!k) {
113+
return update(diag[i + 1][j + 1] - diag[i][j]);
114+
}
115+
// 上:i - k, j
116+
// 下:i + k, j
117+
// 左:i, j - k
118+
// 右:i, j + k
119+
int val = 0
120+
+ diag[i][j + k] - diag[i - k][j] // ↘ [上, 右):(i-k, j)->(i, j+k) | (i-k,j)->(i-1, j+k-1)
121+
+ diag[i + k + 1][j + 1] - diag[i + 1][j - k + 1] // ↘ (左, 下]:(i,j-k)->(i+k,j) | (i+1,j-k+1)->(i+k,j)
122+
+ anti[i + 1][j - k] - anti[i - k + 1][j] // ↗ [左, 上):(i,j-k)->(i-k,j) | (i,j-k)->(i-k+1,j-1)
123+
+ anti[i + k][j + 1] - anti[i][j + k + 1]; // ↗ (下, 右]:(i+k,j)->(i,j+k) | (i+k-1,j+1)->(i,j+k)
124+
update(val);
125+
}
126+
public:
127+
vector<int> getBiggestThree(vector<vector<int>>& grid) {
128+
int n = grid.size(), m = grid[0].size();
129+
diag = vector<vector<int>>(n + 1, vector<int>(m + 1)); // ↘
130+
anti = vector<vector<int>>(n + 1, vector<int>(m + 1)); // ↖
131+
for (int i = 0; i < n; i++) {
132+
for (int j = 0; j < m; j++) {
133+
diag[i + 1][j + 1] = diag[i][j] + grid[i][j];
134+
anti[i + 1][j] = anti[i][j + 1] + grid[i][j];
135+
}
136+
}
137+
138+
for (int i = 0; i < n; i++) {
139+
for (int j = 0; j < m; j++) {
140+
for (int k = 0, max_k = min(i, min(j, min(n - i - 1, m - j - 1))); k <= max_k; k++) {
141+
calc(i, j, k);
142+
}
143+
}
144+
}
145+
146+
vector<int> ans;
147+
if (x) {
148+
ans.push_back(x);
149+
}
150+
if (y) {
151+
ans.push_back(y);
152+
}
153+
if (z) {
154+
ans.push_back(z);
155+
}
156+
return ans;
157+
}
158+
};
159+
```
160+
161+
> 同步发文于[CSDN](https://letmefly.blog.csdn.net/article/details/159162029)和我的[个人博客](https://blog.letmefly.xyz/),原创不易,转载经作者同意后请附上[原文链接](https://blog.letmefly.xyz/2026/03/17/LeetCode%201878.%E7%9F%A9%E9%98%B5%E4%B8%AD%E6%9C%80%E5%A4%A7%E7%9A%84%E4%B8%89%E4%B8%AA%E8%8F%B1%E5%BD%A2%E5%92%8C/)哦~
162+
>
163+
> 千篇源码题解[已开源](https://github.com/LetMeFly666/LeetCode)

Solutions/Other-English-LearningNotes-SomeWords.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1878,6 +1878,10 @@ categories: [自用]
18781878
|||
18791879
|acrobat|n. 杂技演员|
18801880
|photostatic|adj. 静电复印的|
1881+
|||
1882+
|therefrom|adv. 由此,从那里|
1883+
|||
1884+
|crouch|v. 蹲,蜷缩<br/>n. 蹲|
18811885

18821886
+ 这个web要是能设计得可以闭眼(完全不睁眼)键盘控制背单词就好了。
18831887
+ 也许可以加个AI用最近词编故事功能(返回接口中支持标注所使用单词高亮?)

newSolution.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
Author: LetMeFly
33
Date: 2022-07-03 11:21:14
44
LastEditors: LetMeFly.xyz
5-
LastEditTime: 2026-03-05 22:38:46
5+
LastEditTime: 2026-03-17 13:31:00
66
Command: python newSolution.py 102. 二叉树的层序遍历
77
What's more: 当前仅支持数字开头的题目
88
What's more: 代码结构写的很混乱 - 想单文件实现所有操作
@@ -19,6 +19,9 @@
1919
from enum import Enum
2020
from urllib.parse import quote
2121

22+
if sys.platform == 'win32':
23+
import win32clipboard
24+
2225
argv = sys.argv
2326
print(argv)
2427
CODES_TO_GEN = ['cpp', 'python3', 'golang', 'java', 'rust'] # 参考“AllProblems/_mappingData.json”
@@ -205,9 +208,17 @@ def _start_clipboard_monitor():
205208
def _get_clipboard() -> str:
206209
try:
207210
if sys.platform == 'win32':
208-
r = subprocess.run(['powershell', '-command', 'Get-Clipboard'],
209-
capture_output=True, text=True, timeout=2)
210-
return r.stdout.strip()
211+
try:
212+
win32clipboard.OpenClipboard()
213+
data = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT)
214+
win32clipboard.CloseClipboard()
215+
return data.strip()
216+
except Exception:
217+
try:
218+
win32clipboard.CloseClipboard()
219+
except:
220+
pass
221+
return ''
211222
elif sys.platform == 'darwin':
212223
r = subprocess.run(['pbpaste'], capture_output=True, text=True, timeout=2)
213224
return r.stdout.strip()

0 commit comments

Comments
 (0)