給你一個?m * n
?的矩陣,矩陣中的元素不是?0
?就是?1
,請你統計并返回其中完全由?1
?組成的?正方形?子矩陣的個數。
示例 1:
輸入:matrix = [[0,1,1,1],[1,1,1,1],[0,1,1,1] ] 輸出:15 解釋: 邊長為 1 的正方形有 10 個。 邊長為 2 的正方形有 4 個。 邊長為 3 的正方形有 1 個。 正方形的總數 = 10 + 4 + 1 = 15.
示例 2:
輸入:matrix = [[1,0,1],[1,1,0],[1,1,0] ] 輸出:7 解釋: 邊長為 1 的正方形有 6 個。 邊長為 2 的正方形有 1 個。 正方形的總數 = 6 + 1 = 7.
提示:
1 <= arr.length?<= 300
1 <= arr[0].length?<= 300
0 <= arr[i][j] <= 1
分析:由于 arr 的長和寬都不超過 300,可以用枚舉的方法來做。遍歷 arr,當當前值為 1 時,把這個位置作為矩陣的左上角,檢查擴展矩陣是否全部為 1.
int countSquares(int** matrix, int matrixSize, int* matrixColSize) {int ans=0,n=matrixSize,m=matrixColSize[0];for(int i=0;i<n;++i){for(int j=0;j<m;++j){if(matrix[i][j]){ans++;int f=1;for(int len=1;i+len<n&&j+len<m;++len){if(f){for(int k=0;k<=len;++k){if(!matrix[i+k][j+len]){f=0;break;}}if(f){for(int k=0;k<=len;++k){if(!matrix[i+len][j+k]){f=0;break;}}}if(f)ans++;}if(!f)break;}}}}return ans;
}