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;
    }
};

 

posted @ 2018-06-09 12:23  約束の空  阅读(69)  评论(0)    收藏  举报