img

原题链接:LeetCode 5925. 统计农场中肥沃金字塔的数目

解题思路:

  1. 利用前缀和的思维,创建一个存储按行连续的 “1” 的个数的矩阵
  2. 按分别按 “右下”和 “右上” 方向走步,代表着金字塔的层次增加
  3. 符合构成金字塔的条件是当前金字塔的最右方拥有至少拥有 2*层数-1 个连续的 “1”

复杂度分析:

时间复杂度:三层循环 O(m2n)O_{(m^2n)}
空间复杂度:使用前缀和数组 O(m×n)O_{(m\times n)} ,利用原数组grid创建前缀和数组 O(1)O_{(1)}

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public:
int countPyramids(vector<vector<int>>& grid) {
int len_g = grid.size(), len_v = grid[0].size();
int num[len_g][len_v];

for(int i = 0; i < len_g; i++){
int t = 0;
for(int j = 0; j < len_v; j++){
if(grid[i][j]) num[i][j] = ++t;
else num[i][j] = t = 0;
}
}

int ans = 0;
for(int i = 0; i < len_g; i++){
for(int j = 0; j < len_v; j++){
if(num[i][j]){
int h = 2, a = i+1, b = j+1;
while(a < len_g && b < len_v && h*2-1 <= num[a][b]){
ans++, a++, b++, h++;
}

h = 2, a = i-1, b = j+1;
while(~a && b < len_v && h*2-1 <= num[a][b]) {
ans++, a--, b++, h++;
}
}
}
}
return ans;
}
};

润了,润了
咱们下次题解再见吧~