750. Number Of Corner Rectangles
最先想到的是暴力,需要枚举矩形左上角和右下角两个点,需要四重循环。
进一步思考优化的方法。枚举矩阵的两行row1,row2,然后枚举列col,如果两个交点都为1,说明这一组点是可以作为矩形的端点的。在row1与row2上,如果有n组这样的点,说明可以构成n*(n-1)/2个矩形(就变成数轴上n个点能组成多少段线段的问题)。
每次枚举好row1和row2以后,每次都要 O(grid[0].size()) 的时间。可以在遍历row1的时候,就将为1的col坐标保存下来,这样之后只要判断row2上对应的点是否为1就可以了。
class Solution { public: int countCornerRectangles(vector<vector<int>>& grid) { int m=grid.size(), n=grid[0].size(); int res=0; for (int row1=0;row1<m;++row1){ vector<int> col_i; for (int col=0;col<n;++col){ if (grid[row1][col]==1) col_i.push_back(col); } for (int row2=row1+1;row2<m;++row2){ int cnt=0; for (int index:col_i){ if (grid[row2][index]==1) ++cnt; } res += cnt*(cnt-1)/2; } } return res; } };

浙公网安备 33010602011771号