给你一个下标从 0 开始的整数矩阵 grid 和一个整数 k。
返回包含 grid 左上角元素、元素和小于或等于 k 的 子矩阵的数目。
示例 1:

输入:grid = [[7,6,3],[6,6,1]], k = 18
输出:4
解释:如上图所示,只有 4 个子矩阵满足:包含 grid 的左上角元素,并且元素和小于或等于 18 。
示例 2:

输入:grid = [[7,2,9],[1,5,0],[2,6,6]], k = 20
输出:6
解释:如上图所示,只有 6 个子矩阵满足:包含 grid 的左上角元素,并且元素和小于或等于 20 。
提示:
m == grid.lengthn == grid[i].length1 <= n, m <= 10000 <= grid[i][j] <= 10001 <= k <= 10^9
分析:求出二维前缀和,统计有多少个和的值小于等于 k 即可。
cpp
int countSubmatrices(int** grid, int gridSize, int* gridColSize, int k) {
int n=gridSize,m=gridColSize[0],ans=0,sum[n+5][m+5];
if(grid[0][0]>k)return 0;
else ans=1;
sum[0][0]=grid[0][0];
for(int i=1;i<n;++i)
{
sum[i][0]=sum[i-1][0]+grid[i][0];
if(sum[i][0]<=k)ans++;
}
for(int i=1;i<m;++i)
{
sum[0][i]=sum[0][i-1]+grid[0][i];
if(sum[0][i]<=k)ans++;
}
for(int i=1;i<n;++i)
for(int j=1;j<m;++j)
{
sum[i][j]=grid[i][j]-sum[i-1][j-1]+sum[i-1][j]+sum[i][j-1];
if(sum[i][j]<=k)ans++;
}
return ans;
}